Status check always showing that the user is 'offline' - python

So I'm getting an issue here where I'm trying to make a status check command to check if a user is online, offline, idle, or dnd, if they are on mobile or desktop, and maybe even their custom status. However, my main problem is seeing if a user is online/offline or whatever. It seems to always return 'offline' even though I know I'm not offline. Here's my code (currently its just printing to console to see)
#client.command(name="status")
async def status(ctx, user: discord.Member=None):
if not user:
user = ctx.message.author
print(user)
print(user.raw_status)
However when I initiate this command it always returns 'offline', and I haven't been able to figure out why. I've tried: user.status, user.raw_status, user.desktop_status, and just in case it was being weird or I didn't understand it, mobile_status (I'm on desktop.) If anyone has a fix to this please let me know, thanks!

If you haven't added intents to your bot, then you cannot deal with user statuses in a server. Head to "https://discord.com/developers/applications//bot" and under "Privileged Gateway Intents" tick "PRESENCE INTENT" and "SERVER MEMBERS INTENT". This will allow the bot to request presence data from users in the server.
In your bot's code, add
from discord import Intents
client = commands.Bot(command_prefix=YOUR_PREFIX, intents = Intents.all())

Related

How to finish the bot-authentication dialog

I am working with the bot-auth sample and after having the user logged in I need to be able to interact with the user, in my case I would like to start with an echo. I can't find a way to end the dialog and for the bot to start answering the user. Could you guide me with an example or ideas? Thanks
I wouldn't need to show the token, so at this point it would be enough for me to finish here and start interacting with the user
main_dialog.py
async def login_step(self, step_context: WaterfallStepContext) -> DialogTurnResult:
# Get the token from the previous step. Note that we could also have gotten the
# token directly from the prompt itself. There is an example of this in the next method.
if step_context.result:
await step_context.context.send_activity("You are now logged in.")
return await step_context.prompt(
ConfirmPrompt.__name__,
PromptOptions(
prompt=MessageFactory.text("Would you like to view your token?")
),
)
await step_context.context.send_activity(
"Login was not successful please try again."
)
return await step_context.end_dialog()
I could achieve my goal, which was once finished the login of the user to start, e.g, using a echo_bot or qna_bot. The problem is that I couldn't get out of the login-show token dialog loop. The solution "I found" is to create a user_state.create_property() in main_dialog.py and access properties defined get(turn_context) in dialog_bot.py. With this I was able to leave the dialogue.

Microsoft Bot Emulator showing "sending failed. Retry". VSCode shows KeyError: 'HTTP_CONTEXT_TYPE'

I am new to Microsoft Bot Framework, I am learning it through a youtube video https://youtu.be/ynG6Muox81o and making my bot on python3 on Ubuntu.
The Microsoft Bot Emulator says "sending failed. Retry".
Visual Studio Code shows KeyError: 'HTTP_CONTEXT_TYPE'.
I did everything right, my bot is connected to http://localhost:3978/, and bot emulator is connected to http://localhost:3978/api/messages/.
Many people on stackoverflow who had the same issue faced it due to windows firewall, but mine is ubuntu and i did check if it was enabled but its not.
app.py
from flask import Flask, request, Response
from botbuilder.schema import Activity
from botbuilder.core import BotFrameworkAdapter,BotFrameworkAdapterSettings
import asyncio
from echobot import EchoBot
app = Flask(__name__)
loop = asyncio.get_event_loop()
botadaptersettings=BotFrameworkAdapterSettings("","")
botadapter = BotFrameworkAdapter(botadaptersettings)
ebot = EchoBot()
#POST is the message
#app.route("/api/messages",methods=["POST"])
def messages():
#checking if HTTP file format is JSON or not
if "application/json" in request.headers["context-type"]:
#reading the JSON message
jsonmessage = request.json
else:
#unsupported media type 415
return Response(status=415)
activity = Activity().deserialize(jsonmessage)
async def turn_call(turn_context):
await ebot.on_turn(turn_context)
task = loop.create_task(botadapter.process_activity(activity,"",turn_call))
loop.run_until_complete(task)
if __name__ == '__main__':
app.run('localhost',3978)
echobot.py
from botbuilder.core import TurnContext
class EchoBot:
async def on_turn(self,turn_context:TurnContext):
await turn_context.send_activity(turn_context.activity.text)
I cant seem to understand the issue and how to fix it. it would be really helpfull if someone could help me fix this as i am really interested in building bots.
I have uploaded my Bot Project on gitlab https://gitlab.com/pdmnbhrawal/myechobot01.
This is a simple typo. You've written "context-type" instead of "content-type." The YouTube tutorial you linked to tells you to write a line like this:
if "application/json" in request.headers["content-type"]:
In order to avoid this kind of typo, you can download the source code that the video links to directly instead of trying to rewrite it yourself.
You can troubleshoot this kind of error yourself by noticing in the stack trace that it tells you what line of code is throwing the error. When it says KeyError: 'HTTP_CONTEXT_TYPE' that should indicate to you that you've entered the wrong key and you should check for a typo. You can also try using a debugger and stepping through your code.
There are a few other problems with the bot that you may notice. It doesn't handle conversation update activities correctly because it doesn't account for the incoming activity having no text. It also doesn't return an HTTP response from the api/messages endpoint. You might want to fix those problems later, but your bot will run despite them.

SlackClient Python RTM not capturing messages

I want to write a simple slack bot, which responds a given string to # mentions, however I am not able to make the official documentation code to work.
I gave all OAuth permission to the bot and have the following code:
from slack import RTMClient
#RTMClient.run_on(event="message")
def gravity_bot(**payload):
data = payload['data']
print(data.get('text'))
try:
rtm_client = RTMClient(
token="my_token_auth_code",
connect_method='rtm.start'
)
print("Bot is up and running!")
rtm_client.start()
except Exception as err:
print(err)
I think the connection is established, as the "Bot is up and running" message appears, however on the slack channel to bot seems to be offline, also I am not able to get any response in the terminal, not for direct messages, not for channel messages even after inviting the bot to given channels.
Sorry couldn't let this one go.. I figured it out and here are the steps:
Create a "Classic" app in Slack (this is the only way to get the appropriate scopes), just click this link: https://api.slack.com/apps?new_classic_app=1
From the "Add features and functionality" tab click on "bots":
Click the "Add Legacy Bot User" button (this will add the "rtm.stream" scope that you need, but that you cannot add manually)
From the basic information page, install your app in a workspace
From the OAuth & Permissions page, copy the "Bot User OAuth Access Token" (the bottom one)
Run the following code (slightly modified version of the code in the docs)
from slack_sdk.rtm import RTMClient
# This event runs when the connection is established and shows some connection info
#RTMClient.run_on(event="open")
def show_start(**payload):
print(payload)
#RTMClient.run_on(event="message")
def say_hello(**payload):
print(payload)
data = payload['data']
web_client = payload['web_client']
if 'Hello' in data['text']:
channel_id = data['channel']
thread_ts = data['ts']
user = data['user']
web_client.chat_postMessage(
channel=channel_id,
text=f"Hi <#{user}>!",
thread_ts=thread_ts
)
if __name__ == "__main__":
slack_token = "<YOUR TOKEN HERE>"
rtm_client = RTMClient(token=slack_token)
rtm_client.start()
Previous answer:
Hmm, this is tricky one... According to the docs this only works for "classic" Slack apps, so that might be the first pointer. It explicitly says that you should not upgrade your app. Furthermore, you'll need to set the right permissions (god knows which ones) by selecting the "bot" scope.
Honestly, I haven't been able to get this running. Looks like Slack is getting rid of this connection method, so you might have more luck looking into the "Events API". I know it's not the ideal solution because its not as real-time, but it looks better documented and it will stay around for a while. Another approach could be polling. Its not sexy but it works...
My guess is that your problem is that there is not a valid connection, but there is no proper error handling in the Slack library. The message is printed before you actually connect, so that doesn't indicate anything.

Python Telegram Bot. Get message to which given message replies

I want to develop a Telegram bot, that acts as a bookmarking system. It should process commands that reply to other messages. The instance:
I use python-telegram-bot for development and it seems that there is no way to see that message to which /important replies. I found the Update.message.reply_to_message object, which works only when a user replies to a message from the bot itself.
def important_handler(update: Update, context: CallbackContext):
reply_to_message = update.message.reply_to_message
if reply_to_message is None:
logger.error('reply_to_message is None. But it shouldn\'t.')
update.message.reply_text('There is no message attached. Try again.')
return
# ... business logic
Is there any way to get reply_to_message attribute (or an alternative) for all the replies? Thanks in advice;)
I had the same problem. It only worked when a user replied to the bot. My issue was that the bot had Privacy Mode enabled. Once I disabled it with Botfather via /setprivacy and then it worked.

post in private channel

I'm trying to write a telegram python bot that posts in my private channel for Authorized users only
I succeeded to make a bot that work only for Authorized users but i cant finish that and cant find anything that can help, need to know how can i make that Authorized user can save post in memory and press in the botton Whenever he wants to post in the channel
stuck from here ;
#restricted
def start(update, context):
keyboard = [[InlineKeyboardButton("change post", callback_data='1'),
InlineKeyboardButton("show saved post", callback_data='2')],
[InlineKeyboardButton("post in channel", callback_data='3')]]
anyone can help me please? Thanks in advance

Categories