How to add a Slack reaction to a send_card - python

I have an Errbot function that sends a Slack card. How do I then add a reaction to the card instead of the original message(msg) that was received?
#botcmd
def example(self, msg):
self.send_card(title='Test',
body='test123',
thumbnail=' ',
image=' ',
link=' ',
color='green',
in_reply_to=msg)
self._bot.add_reaction(card_msg??, 'grey_question')

send_card does not return to you the message it sends which means you will have to do something to get the message info of the card you sent.
One option would be to trigger a callback for all messages in your plugin, inspect the message, and add your reaction there:
Another option could be to use the slack backend api call method to search for your message and add the reaction that way.

Related

Get message ID of last sent message from Discord.py webhook

This is the sync code for my discord embed, I've been trying to get the message ID of the message sent so that I can edit it, I'm trying to automate some tasks but been unsuccessful so far.
Here's the code:
embed = discord.Embed(title="Post Title")
embed.add_field(name="Req AMount", value="100")
embed.add_field(name="Return AMount", value="120")
webhook = SyncWebhook.partial(1055498127618097174, "prxoD_ZW0vO6ghrwZNhOiwI9AeLBfNYYss6MTLPkjgvAb_B3WJgWNLMMtPWYZ67GTYbn")
sending = webhook.send(embed=embed)
Any help would be appreciated thanks
In the webhook.send message, if you set the parameter wait to True, you will get a WebhookMessage object returned, which you can then use the edit/delete the message your webhook sent.
Note that the WebhookMessage object doesn't have the ID parameter but has an edit and delete methods. Typically, as webhooks are used to send messages to channels/servers you might not have a bot in/permissions for, what you can do with the returned message object is a little less.
Webhook docs send here
WebhookMessage docs here

How to send message using python-telegram-bot

I'm new using python and telegram-bot
I'm trying to found a way to send messages using python-telegram-bot when I received a message without uses:
requests.post(
'https://api.telegram.org/bot<token>/sendMessage?chat_id=<id>&text=Hello World!')
Flow:
Message arrived on channel A then send a new message to channel B (Message receveid on Channel A).
I only found reply_text. Is there other way to do it ?
Thanks !
reply_text won't work because it will send the message back to channel A. You would need bot.send_message where you can set the target channel with chat_id. A simple example:
def update_message_to_channel_B(update: object, context: CallbackContext) -> None:
context.bot.send_message(chat_id=CHANNEL_B_ID, text='Message receveid on Channel A')
And add the handler:
dispatcher.add_handler(MessageHandler(Filters.text, update_message_to_channel_B))

Wait for user input before a send_message

I'm having a problem with handling incoming messages. I have a main menu in my bot with one InlineKeyboardMarkup. When the button is pressed, the bot should wait for user input and then send a message. But in my case, it sends the message, then it waits for user input and then it sends again the message. And that's a big problem, because after the message it sends, it should go back to main menu.
I'm using pythonTelegramBotAPI (telebot)
That's the code:
#bot.callback_query_handler(func = lambda call: True)
def query_handler(call):
bot.answer_callback_query(callback_query_id = call.id, text = '')
cid = call.message.chat.id
mid = call.message.message_id
msg = call.message
if call.data == 'request':
bot.edit_message_text('Test - Answer to request', cid, mid, reply_markup = markup)
request_handler(msg)
################# Keyboard sections #################
#bot.message_handler()
def request_handler(msg):
if msg.content_type == 'text':
bot.send_message(msg.chat.id, 'Request accepted')
# and here the code to go back, that I didn't do yet
Perhaps this conversational bot example will help you to understand how to build dialog with user.
Correct answer
The decorator #bot.messge_handler() is used to tell to the function that it must be handle incoming messages. So, when there's a new message, the function will do the code inside it automatically. This means that the function must not be called manually as is not required. Calling the function will, in fact, run the code inside it, instead of initializing it and waiting for an input.
And here's a tip: if the user send a message, the function is automatically called. But what happens when the bot send a message? The function is also called, because it doesn't make difference about who sent the message. So, to avoid using the function also for bot messages, just put an if in like this:
if msg.from_user.is_bot == False:
# Here put what the function should do
The if, as you can see, check if the message is coming from the bot.

problem with forward message method in telegram bot

I am trying to forward a message in telegram bot API in python . It shows "Bad Request: chat_id is empty" despite using same chat_id in sendMessage and works perfectly fine.
https://api.telegram.org/bot{BOT_TOKEN}/forwardMessage?chat_id={CHAT_ID}&from_chat_id={ID}&message_id={MID}
my problem is what is the message id and how can i find it?
for example chat id is like this number 123456789.
what does message id look like ?
You are a bot. So, people interact with you (directly or in a group). When a message is sent to your bot, you would receive a callback that includes the message details (including the chat_id, the sender chat id, the message id, and all other details). Something like this (see message->message_id and message->from_id):
{
"update_id":1111,
"message":{
"message_id":111,
"from":{
"id":1111,
"is_bot":false,
"first_name":"...",
"last_name":"...",
"username":"...",
},
"chat":{
"id":1111,
"first_name":"...",
"last_name":"...",
"username":"...",
"type":"private"
},
"date": 1111,
"text":"...."
}
}
So, you can store those details and use them to forward that message to another chat. In each chat (unique chat id), each message has a chat id (which is usually an incremental number) and by these two identifier, you can uniquely select which message from which chat should be forwarded.
Depends on where you want to access a chat_id, you can use different ways.
if you want to send a specific message to a user or bot that you don't know his chat_id, you can print a message from that user and access chat_id. Or simply forward a message from that user to #ShowChatIdBot and it returns you the related chat_id.
In fact this bot extract data from your forwarded message and gives back chat_id in that message to you.

Telegram bot API: get message id to forward it

So, I need my bot to forward a message of a chat. But in order to do so, I need to get the id of the message I want to forward (it's an old message). How can I get the id of that message so I can send it?
This is the code I'm using
#bot.message_handler(func=lambda m: True)
def reply_ids(message):
cid = message.chat.id
bot.reply_to(message, "The message id is: " + str(message.message_id) + " This chat ID is: " + str(cid))
When receiving a message, the id will be in message.message_id, as documented here.
If it is a supergroup or a channel, you can get the message_id by clicking on the message (in telegram web ) then choosing copy message link. the link will be in this form "https://t.me/channel_name/message_id"
This solution is to find the message_id manually!!
Recently I've been working with callback queries from inline buttons. One things I noticed is that in order to reply to the exact message that had the buttons Telegram needs to know both message.chat_id and message.message_id. You can try with both. This is more a comment then an answer but I don't have enough reputation to comment.
UPDATE: Now, It's update.message.message_id
Using python, if you have a CommandHandler() you can read the chat_id and message_id like so:
https://stackoverflow.com/a/72433953/1000741

Categories