exclam: Reorder handler list so commands are listed ordered in help
Annotate for file /exclam.py
2023-06-25 E. 1 # irgramd: IRC-Telegram gateway
22:17:22 ' 2 # exclam.py: IRC exclamation command handlers
' 3 #
2024-04-07 E. 4 # Copyright (c) 2023, 2024 E. Bosch <presidev@AT@gmail.com>
2023-06-25 E. 5 #
22:17:22 ' 6 # Use of this source code is governed by a MIT style license that
' 7 # can be found in the LICENSE file included in this project.
' 8
2024-04-14 E. 9 import os
2024-10-10 E. 10 from telethon.tl.functions.messages import SendReactionRequest
21:11:40 ' 11 from telethon import types as tgty
' 12 from telethon.errors.rpcerrorlist import MessageNotModifiedError, MessageAuthorRequiredError, ReactionInvalidError
2023-07-10 E. 13
2023-06-25 E. 14 from utils import command, HELP
2024-10-10 E. 15 from emoji2emoticon import emo_inv
2023-06-25 E. 16
22:17:22 ' 17 class exclam(command):
' 18 def __init__(self, telegram):
' 19 self.commands = \
' 20 { # Command Handler Arguments Min Max Maxsplit
2023-07-17 E. 21 '!del': (self.handle_command_del, 1, 1, -1),
2024-10-26 E. 22 '!ed': (self.handle_command_ed, 2, 2, 2),
2024-04-07 E. 23 '!fwd': (self.handle_command_fwd, 2, 2, -1),
2024-10-26 E. 24 '!re': (self.handle_command_re, 2, 2, 2),
2024-10-10 E. 25 '!react': (self.handle_command_react, 2, 2, -1),
2024-10-26 E. 26 '!reupl': (self.handle_command_reupl, 2, 3, 3),
11:01:02 ' 27 '!upl': (self.handle_command_upl, 1, 2, 2),
2023-06-25 E. 28 }
22:17:22 ' 29 self.tg = telegram
' 30 self.irc = telegram.irc
' 31 self.tmp_ircnick = None
' 32 self.tmp_telegram_id = None
' 33 self.tmp_tg_msg = None
' 34
' 35 async def command(self, message, telegram_id, user):
' 36 self.tmp_telegram_id = telegram_id
' 37 res = await self.parse_command(message, nick=None)
' 38 if isinstance(res, tuple):
' 39 await self.irc.send_msg(self.irc.service_user, None, res[0], user)
' 40 res = False
' 41 return res, self.tmp_tg_msg
2023-07-10 E. 42
23:48:40 ' 43 async def check_msg(self, cid):
' 44 id = self.tg.mid.id_to_num_offset(self.tmp_telegram_id, cid)
2024-08-18 E. 45 if id is None or id < -2147483648 or id > 2147483647:
2023-07-17 E. 46 chk_msg = None
00:37:21 ' 47 else:
' 48 chk_msg = await self.tg.telegram_client.get_messages(entity=self.tmp_telegram_id, ids=id)
2023-07-10 E. 49 return id, chk_msg
2023-06-25 E. 50
22:17:22 ' 51 async def handle_command_re(self, cid=None, msg=None, help=None):
' 52 if not help:
2023-07-10 E. 53 id, chk_msg = await self.check_msg(cid)
2023-06-25 E. 54 if chk_msg is not None:
2023-07-11 E. 55 self.tmp_tg_msg = await self.tg.telegram_client.send_message(self.tmp_telegram_id, msg, reply_to=id)
21:54:41 ' 56 reply = True
2023-06-25 E. 57 else:
2024-04-27 E. 58 reply = ('!re: Unknown message to reply',)
2023-06-25 E. 59 else: # HELP.brief or HELP.desc (first line)
22:17:22 ' 60 reply = (' !re Reply to a message',)
' 61 if help == HELP.desc: # rest of HELP.desc
' 62 reply += \
' 63 (
' 64 ' !re <compact_id> <message>',
' 65 'Reply with <message> to a message with <compact_id> on current',
2024-08-29 E. 66 'channel/chat.',
2023-07-10 E. 67 )
23:48:40 ' 68 return reply
' 69
' 70 async def handle_command_ed(self, cid=None, new_msg=None, help=None):
' 71 if not help:
' 72 id, ed_msg = await self.check_msg(cid)
' 73 if ed_msg is not None:
2023-07-11 E. 74 try:
21:54:41 ' 75 self.tmp_tg_msg = await self.tg.telegram_client.edit_message(ed_msg, new_msg)
' 76 except MessageNotModifiedError:
' 77 self.tmp_tg_msg = ed_msg
' 78 reply = True
' 79 except MessageAuthorRequiredError:
2024-04-27 E. 80 reply = ('!ed: Not the author of the message to edit',)
2023-07-11 E. 81 else:
21:54:41 ' 82 reply = True
2023-07-10 E. 83 else:
2023-07-11 E. 84 reply = ('Unknown message to edit',)
2023-07-10 E. 85 else: # HELP.brief or HELP.desc (first line)
23:48:40 ' 86 reply = (' !ed Edit a message',)
' 87 if help == HELP.desc: # rest of HELP.desc
' 88 reply += \
' 89 (
' 90 ' !ed <compact_id> <new_message>',
' 91 'Edit a message with <compact_id> on current channel/chat,',
2024-08-29 E. 92 '<new_message> replaces the current message.',
2023-07-17 E. 93 )
00:37:21 ' 94 return reply
' 95
' 96 async def handle_command_del(self, cid=None, help=None):
' 97 if not help:
' 98 id, del_msg = await self.check_msg(cid)
' 99 if del_msg is not None:
' 100 deleted = await self.tg.telegram_client.delete_messages(self.tmp_telegram_id, del_msg)
' 101 if deleted[0].pts_count == 0:
2024-04-27 E. 102 reply = ('!del: Not possible to delete',)
2023-07-17 E. 103 else:
00:37:21 ' 104 self.tmp_tg_msg = None
' 105 reply = None
' 106 else:
' 107 reply = ('Unknown message to delete',)
' 108 else: # HELP.brief or HELP.desc (first line)
' 109 reply = (' !del Delete a message',)
' 110 if help == HELP.desc: # rest of HELP.desc
' 111 reply += \
' 112 (
' 113 ' !del <compact_id>',
' 114 'Delete a message with <compact_id> on current channel/chat'
2024-04-07 E. 115 )
17:07:04 ' 116 return reply
' 117
' 118 async def handle_command_fwd(self, cid=None, chat=None, help=None):
' 119 if not help:
' 120 id, chk_msg = await self.check_msg(cid)
' 121 if chk_msg is not None:
' 122 async def send_fwd(tgt_ent, id):
' 123 from_ent = await self.tg.telegram_client.get_entity(self.tmp_telegram_id)
' 124 self.tmp_tg_msg = await self.tg.telegram_client.forward_messages(tgt_ent, id, from_ent)
' 125 return self.tmp_tg_msg
' 126
' 127 tgt = chat.lower()
' 128 if tgt in self.irc.iid_to_tid:
' 129 tgt_ent = await self.tg.telegram_client.get_entity(self.irc.iid_to_tid[tgt])
' 130 msg = await send_fwd(tgt_ent, id)
' 131 # echo fwded message
' 132 await self.tg.handle_telegram_message(event=None, message=msg)
' 133 reply = True
' 134 elif tgt in (u.irc_nick.lower() for u in self.irc.users.values() if u.stream):
' 135 tgt_ent = await self.tg.telegram_client.get_me()
' 136 await send_fwd(tgt_ent, id)
' 137 reply = True
' 138 else:
2024-04-27 E. 139 reply = ('!fwd: Unknown chat to forward',)
2024-04-07 E. 140 else:
17:07:04 ' 141 reply = ('Unknown message to forward',)
' 142 else: # HELP.brief or HELP.desc (first line)
' 143 reply = (' !fwd Forward a message',)
' 144 if help == HELP.desc: # rest of HELP.desc
' 145 reply += \
' 146 (
' 147 ' !fwd <compact_id> <chat>',
' 148 'Forward a message with <compact_id> to <chat> channel/chat.'
2024-04-14 E. 149 )
20:48:30 ' 150 return reply
' 151
2024-08-18 E. 152 async def handle_command_upl(self, file=None, caption=None, help=None, re_id=None):
2024-04-14 E. 153 if not help:
20:48:30 ' 154 try:
2024-04-21 E. 155 if file[:8] == 'https://' or file[:7] == 'http://':
18:59:04 ' 156 file_path = file
' 157 else:
' 158 file_path = os.path.join(self.tg.telegram_upload_dir, file)
2024-08-18 E. 159 self.tmp_tg_msg = await self.tg.telegram_client.send_file(self.tmp_telegram_id, file_path, caption=caption, reply_to=re_id)
2024-04-14 E. 160 reply = True
20:48:30 ' 161 except:
2024-08-18 E. 162 cmd = '!reupl' if re_id else '!upl'
12:01:26 ' 163 reply = ('{}: Error uploading'.format(cmd),)
2024-04-14 E. 164 else: # HELP.brief or HELP.desc (first line)
20:48:30 ' 165 reply = (' !upl Upload a file to current channel/chat',)
' 166 if help == HELP.desc: # rest of HELP.desc
' 167 reply += \
' 168 (
2024-04-21 E. 169 ' !upl <file name/URL> [<optional caption>]',
18:59:04 ' 170 'Upload the file referenced by <file name/URL> to current',
2024-04-14 E. 171 'channel/chat, the file must be present in "upload"',
2024-08-29 E. 172 'irgramd local directory or be an external HTTP/HTTPS URL.',
2024-08-18 E. 173 )
12:01:26 ' 174 return reply
' 175
' 176 async def handle_command_reupl(self, cid=None, file=None, caption=None, help=None):
' 177 if not help:
' 178 id, chk_msg = await self.check_msg(cid)
' 179 if chk_msg is not None:
' 180 reply = await self.handle_command_upl(file, caption, re_id=id)
' 181 else:
' 182 reply = ('!reupl: Unknown message to reply',)
' 183 else: # HELP.brief or HELP.desc (first line)
' 184 reply = (' !reupl Reply to a message with an upload',)
' 185 if help == HELP.desc: # rest of HELP.desc
' 186 reply += \
' 187 (
' 188 ' !reupl <compact_id> <file name/URL> [<optional caption>]',
' 189 'Reply with the upload of <file name/URL> to a message with',
' 190 '<compact_id> on current channel/chat. The file must be',
' 191 'present in "upload" irgramd local directory or be an external',
2024-08-29 E. 192 'HTTP/HTTPS URL.',
2024-10-10 E. 193 )
21:11:40 ' 194 return reply
' 195
' 196 async def handle_command_react(self, cid=None, act=None, help=None):
' 197 if not help:
' 198 id, chk_msg = await self.check_msg(cid)
' 199 if chk_msg is not None:
' 200 if act in emo_inv:
' 201 utf8_emo = emo_inv[act]
2024-10-20 E. 202 reaction = [ tgty.ReactionEmoji(emoticon=utf8_emo) ] if utf8_emo else None
2024-10-10 E. 203 try:
21:11:40 ' 204 update = await self.tg.telegram_client(SendReactionRequest(self.tmp_telegram_id, id, reaction=reaction))
' 205 except ReactionInvalidError:
' 206 reply = ('!react: Reaction not allowed',)
' 207 else:
' 208 self.tmp_tg_msg = update.updates[0].message
' 209 reply = True
' 210 else:
' 211 reply = ('!react: Unknown reaction',)
' 212 else:
' 213 reply = ('!react: Unknown message to react',)
' 214 else: # HELP.brief or HELP.desc (first line)
' 215 reply = (' !react React to a message',)
' 216 if help == HELP.desc: # rest of HELP.desc
' 217 reply += \
' 218 (
2024-10-20 E. 219 ' !react <compact_id> <emoticon reaction>|-',
2024-10-10 E. 220 'React with <emoticon reaction> to a message with <compact_id>,',
21:11:40 ' 221 'irgramd will translate emoticon to closest emoji.',
2024-10-20 E. 222 'Use - to remove a previous reaction.',
2023-06-25 E. 223 )
22:17:22 ' 224 return reply