Add commands to add and delete contacts. Fixes #885

This commit is contained in:
Tulir Asokan
2023-11-10 14:42:06 +02:00
parent d72897dfe8
commit 897a35be5d
2 changed files with 76 additions and 2 deletions
+2
View File
@@ -159,6 +159,7 @@ def command_handler(
needs_admin: bool = False, needs_admin: bool = False,
management_only: bool = False, management_only: bool = False,
name: str | None = None, name: str | None = None,
aliases: list[str] | None = None,
help_text: str = "", help_text: str = "",
help_args: str = "", help_args: str = "",
help_section: HelpSection = None, help_section: HelpSection = None,
@@ -167,6 +168,7 @@ def command_handler(
_func, _func,
_handler_class=CommandHandler, _handler_class=CommandHandler,
name=name, name=name,
aliases=aliases,
help_text=help_text, help_text=help_text,
help_args=help_args, help_args=help_args,
help_section=help_section, help_section=help_section,
+74 -2
View File
@@ -18,8 +18,8 @@ from __future__ import annotations
from typing import cast from typing import cast
import base64 import base64
import codecs import codecs
import math
import re import re
import shlex
from aiohttp import ClientSession, InvalidURL from aiohttp import ClientSession, InvalidURL
from telethon.errors import ( from telethon.errors import (
@@ -29,10 +29,10 @@ from telethon.errors import (
InviteHashInvalidError, InviteHashInvalidError,
InviteRequestSentError, InviteRequestSentError,
OptionsTooMuchError, OptionsTooMuchError,
TakeoutInitDelayError,
UserAlreadyParticipantError, UserAlreadyParticipantError,
) )
from telethon.tl.functions.channels import JoinChannelRequest from telethon.tl.functions.channels import JoinChannelRequest
from telethon.tl.functions.contacts import DeleteByPhonesRequest, ImportContactsRequest
from telethon.tl.functions.messages import ( from telethon.tl.functions.messages import (
CheckChatInviteRequest, CheckChatInviteRequest,
GetBotCallbackAnswerRequest, GetBotCallbackAnswerRequest,
@@ -42,12 +42,14 @@ from telethon.tl.functions.messages import (
from telethon.tl.patched import Message from telethon.tl.patched import Message
from telethon.tl.types import ( from telethon.tl.types import (
InputMediaDice, InputMediaDice,
InputPhoneContact,
MessageMediaGame, MessageMediaGame,
MessageMediaPoll, MessageMediaPoll,
TypeInputPeer, TypeInputPeer,
TypeUpdates, TypeUpdates,
User as TLUser, User as TLUser,
) )
from telethon.tl.types.contacts import ImportedContacts
from telethon.tl.types.messages import BotCallbackAnswer from telethon.tl.types.messages import BotCallbackAnswer
from mautrix.types import EventID, Format from mautrix.types import EventID, Format
@@ -161,6 +163,76 @@ async def pm(evt: CommandEvent) -> EventID:
return await evt.reply(f"Created private chat room with {displayname}") return await evt.reply(f"Created private chat room with {displayname}")
async def _handle_contact(source: AbstractUser, user: TLUser) -> str:
puppet: pu.Puppet = await pu.Puppet.get_by_tgid(user.id)
await puppet.update_info(source, user)
params = []
if user.username:
params.append(f"[@{user.username}](https://t.me/{user.username})")
if user.phone:
params.append(f"+{user.phone}")
params.append(f"ID `{user.id}`")
params_str = " / ".join(params)
return f"[{puppet.displayname}](https://matrix.to/#/{puppet.mxid}): {params_str}"
@command_handler(
help_section=SECTION_CREATING_PORTALS,
help_args="<_phone_> <_first name_> <_last name_>",
help_text="Add a phone number to your contacts on Telegram",
)
async def add_contact(evt: CommandEvent) -> EventID:
if len(evt.args) < 3:
return await evt.reply(
"**Usage:** `$cmdprefix+sp add-contact <phone> <first name> <last name>`"
)
try:
names = shlex.split(" ".join(evt.args[1:]))
except ValueError as e:
return await evt.reply(
f"Failed to parse names (use shell quoting for names with spaces): {e}"
)
if len(names) != 2:
return await evt.reply(
"Wrong number of names, must have first and last name "
"(use shell quoting for names with spaces)"
)
res: ImportedContacts = await evt.sender.client(
ImportContactsRequest(
contacts=[
InputPhoneContact(
client_id=1, phone=evt.args[0], first_name=names[0], last_name=names[1]
)
]
)
)
if res.retry_contacts:
return await evt.reply("Failed to import contacts")
elif not res.users:
return await evt.reply("Contact imported, but user not found on Telegram")
imported_str = "\n".join(
[f"* {await _handle_contact(evt.sender, user)}" for user in res.users]
)
return await evt.reply(f"Imported contacts:\n\n{imported_str}")
@command_handler(
help_section=SECTION_CREATING_PORTALS,
help_args="<_phones..._>",
help_text="Remove phone numbers from your contacts on Telegram.",
aliases=["remove-contact", "delete-contacts", "remove-contacts"],
)
async def delete_contact(evt: CommandEvent) -> EventID:
if len(evt.args) == 0:
return await evt.reply("**Usage:** `$cmdprefix+sp delete-contact <phones...>`")
ok = await evt.sender.client(DeleteByPhonesRequest(phones=evt.args))
if ok:
return await evt.reply("Contacts deleted")
else:
return await evt.reply("Contacts not deleted?")
async def _join( async def _join(
evt: CommandEvent, identifier: str, link_type: str evt: CommandEvent, identifier: str, link_type: str
) -> tuple[TypeUpdates | None, EventID | None]: ) -> tuple[TypeUpdates | None, EventID | None]: