repos
/
irgramd
/ annotate_shade
exclam: Add command indicator to error messages
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
2023-07-10 E.
10
from telethon.errors.rpcerrorlist import MessageNotModifiedError, MessageAuthorRequiredError
23:48:40 '
11
2023-06-25 E.
12
from utils import command, HELP
22:17:22 '
13
'
14
class exclam(command):
'
15
def __init__(self, telegram):
'
16
self.commands = \
'
17
{ # Command Handler Arguments Min Max Maxsplit
'
18
'!re': (self.handle_command_re, 2, 2, 2),
2023-07-10 E.
19
'!ed': (self.handle_command_ed, 2, 2, 2),
2023-07-17 E.
20
'!del': (self.handle_command_del, 1, 1, -1),
2024-04-07 E.
21
'!fwd': (self.handle_command_fwd, 2, 2, -1),
2024-04-14 E.
22
'!upl': (self.handle_command_upl, 1, 2, 2),
2023-06-25 E.
23
}
22:17:22 '
24
self.tg = telegram
'
25
self.irc = telegram.irc
'
26
self.tmp_ircnick = None
'
27
self.tmp_telegram_id = None
'
28
self.tmp_tg_msg = None
'
29
'
30
async def command(self, message, telegram_id, user):
'
31
self.tmp_telegram_id = telegram_id
'
32
res = await self.parse_command(message, nick=None)
'
33
if isinstance(res, tuple):
'
34
await self.irc.send_msg(self.irc.service_user, None, res[0], user)
'
35
res = False
'
36
return res, self.tmp_tg_msg
2023-07-10 E.
37
23:48:40 '
38
async def check_msg(self, cid):
'
39
id = self.tg.mid.id_to_num_offset(self.tmp_telegram_id, cid)
2023-07-17 E.
40
if id is None:
00:37:21 '
41
chk_msg = None
'
42
else:
'
43
chk_msg = await self.tg.telegram_client.get_messages(entity=self.tmp_telegram_id, ids=id)
2023-07-10 E.
44
return id, chk_msg
2023-06-25 E.
45
22:17:22 '
46
async def handle_command_re(self, cid=None, msg=None, help=None):
'
47
if not help:
2023-07-10 E.
48
id, chk_msg = await self.check_msg(cid)
2023-06-25 E.
49
if chk_msg is not None:
2023-07-11 E.
50
self.tmp_tg_msg = await self.tg.telegram_client.send_message(self.tmp_telegram_id, msg, reply_to=id)
21:54:41 '
51
reply = True
2023-06-25 E.
52
else:
2024-04-27 E.
53
reply = ('!re: Unknown message to reply',)
2023-06-25 E.
54
else: # HELP.brief or HELP.desc (first line)
22:17:22 '
55
reply = (' !re Reply to a message',)
'
56
if help == HELP.desc: # rest of HELP.desc
'
57
reply += \
'
58
(
'
59
' !re <compact_id> <message>',
'
60
'Reply with <message> to a message with <compact_id> on current',
'
61
'channel/chat.'
2023-07-10 E.
62
)
23:48:40 '
63
return reply
'
64
'
65
async def handle_command_ed(self, cid=None, new_msg=None, help=None):
'
66
if not help:
'
67
id, ed_msg = await self.check_msg(cid)
'
68
if ed_msg is not None:
2023-07-11 E.
69
try:
21:54:41 '
70
self.tmp_tg_msg = await self.tg.telegram_client.edit_message(ed_msg, new_msg)
'
71
except MessageNotModifiedError:
'
72
self.tmp_tg_msg = ed_msg
'
73
reply = True
'
74
except MessageAuthorRequiredError:
2024-04-27 E.
75
reply = ('!ed: Not the author of the message to edit',)
2023-07-11 E.
76
else:
21:54:41 '
77
reply = True
2023-07-10 E.
78
else:
2023-07-11 E.
79
reply = ('Unknown message to edit',)
2023-07-10 E.
80
else: # HELP.brief or HELP.desc (first line)
23:48:40 '
81
reply = (' !ed Edit a message',)
'
82
if help == HELP.desc: # rest of HELP.desc
'
83
reply += \
'
84
(
'
85
' !ed <compact_id> <new_message>',
'
86
'Edit a message with <compact_id> on current channel/chat,',
'
87
'<new_message> replaces the current message.'
2023-07-17 E.
88
)
00:37:21 '
89
return reply
'
90
'
91
async def handle_command_del(self, cid=None, help=None):
'
92
if not help:
'
93
id, del_msg = await self.check_msg(cid)
'
94
if del_msg is not None:
'
95
deleted = await self.tg.telegram_client.delete_messages(self.tmp_telegram_id, del_msg)
'
96
if deleted[0].pts_count == 0:
2024-04-27 E.
97
reply = ('!del: Not possible to delete',)
2023-07-17 E.
98
else:
00:37:21 '
99
self.tmp_tg_msg = None
'
100
reply = None
'
101
else:
'
102
reply = ('Unknown message to delete',)
'
103
else: # HELP.brief or HELP.desc (first line)
'
104
reply = (' !del Delete a message',)
'
105
if help == HELP.desc: # rest of HELP.desc
'
106
reply += \
'
107
(
'
108
' !del <compact_id>',
'
109
'Delete a message with <compact_id> on current channel/chat'
2024-04-07 E.
110
)
17:07:04 '
111
return reply
'
112
'
113
async def handle_command_fwd(self, cid=None, chat=None, help=None):
'
114
if not help:
'
115
id, chk_msg = await self.check_msg(cid)
'
116
if chk_msg is not None:
'
117
async def send_fwd(tgt_ent, id):
'
118
from_ent = await self.tg.telegram_client.get_entity(self.tmp_telegram_id)
'
119
self.tmp_tg_msg = await self.tg.telegram_client.forward_messages(tgt_ent, id, from_ent)
'
120
return self.tmp_tg_msg
'
121
'
122
tgt = chat.lower()
'
123
if tgt in self.irc.iid_to_tid:
'
124
tgt_ent = await self.tg.telegram_client.get_entity(self.irc.iid_to_tid[tgt])
'
125
msg = await send_fwd(tgt_ent, id)
'
126
# echo fwded message
'
127
await self.tg.handle_telegram_message(event=None, message=msg)
'
128
reply = True
'
129
elif tgt in (u.irc_nick.lower() for u in self.irc.users.values() if u.stream):
'
130
tgt_ent = await self.tg.telegram_client.get_me()
'
131
await send_fwd(tgt_ent, id)
'
132
reply = True
'
133
else:
2024-04-27 E.
134
reply = ('!fwd: Unknown chat to forward',)
2024-04-07 E.
135
else:
17:07:04 '
136
reply = ('Unknown message to forward',)
'
137
else: # HELP.brief or HELP.desc (first line)
'
138
reply = (' !fwd Forward a message',)
'
139
if help == HELP.desc: # rest of HELP.desc
'
140
reply += \
'
141
(
'
142
' !fwd <compact_id> <chat>',
'
143
'Forward a message with <compact_id> to <chat> channel/chat.'
2024-04-14 E.
144
)
20:48:30 '
145
return reply
'
146
'
147
async def handle_command_upl(self, file=None, caption=None, help=None):
'
148
if not help:
'
149
try:
2024-04-21 E.
150
if file[:8] == 'https://' or file[:7] == 'http://':
18:59:04 '
151
file_path = file
'
152
else:
'
153
file_path = os.path.join(self.tg.telegram_upload_dir, file)
2024-04-14 E.
154
self.tmp_tg_msg = await self.tg.telegram_client.send_file(self.tmp_telegram_id, file_path, caption=caption)
20:48:30 '
155
reply = True
'
156
except:
2024-04-27 E.
157
reply = ('!upl: Error uploading',)
2024-04-14 E.
158
else: # HELP.brief or HELP.desc (first line)
20:48:30 '
159
reply = (' !upl Upload a file to current channel/chat',)
'
160
if help == HELP.desc: # rest of HELP.desc
'
161
reply += \
'
162
(
2024-04-21 E.
163
' !upl <file name/URL> [<optional caption>]',
18:59:04 '
164
'Upload the file referenced by <file name/URL> to current',
2024-04-14 E.
165
'channel/chat, the file must be present in "upload"',
2024-04-21 E.
166
'irgramd local directory or be an external HTTP/HTTPS URL.'
2023-06-25 E.
167
)
22:17:22 '
168
return reply