mirror of
https://github.com/lifegpc/pythonscript.git
synced 2026-06-23 19:06:47 +08:00
add display chat information and ask for confirm
This commit is contained in:
94
tdlib.py
94
tdlib.py
@@ -1,12 +1,13 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from ctypes import CDLL, c_char_p, c_double, c_int, c_void_p
|
from ctypes import CDLL, c_char_p, c_double, c_int, c_void_p
|
||||||
from ctypes.util import find_library
|
from ctypes.util import find_library
|
||||||
|
from enum import Enum
|
||||||
|
from getpass import getpass
|
||||||
|
from json import dumps, loads, JSONDecoder, JSONEncoder
|
||||||
|
from random import random
|
||||||
import sys
|
import sys
|
||||||
from json import dumps, loads
|
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
from random import random
|
|
||||||
from getpass import getpass
|
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
|
||||||
@@ -75,6 +76,78 @@ class UpdateThread(Thread):
|
|||||||
print_exc()
|
print_exc()
|
||||||
|
|
||||||
|
|
||||||
|
class ChatType(Enum):
|
||||||
|
BasicGroup = 0
|
||||||
|
Private = 1
|
||||||
|
Secret = 2
|
||||||
|
SuperGroup = 3
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return self.to_dict().items().__iter__()
|
||||||
|
|
||||||
|
def to_dict(self):
|
||||||
|
if self._value_ == 0:
|
||||||
|
return {"@type": "chatTypeBasicGroup",
|
||||||
|
"basic_group_id": self.basic_group_id}
|
||||||
|
elif self._value_ == 1:
|
||||||
|
return {"@type": 'chatTypePrivate', 'user_id': self.user_id}
|
||||||
|
elif self._value_ == 2:
|
||||||
|
return {"@type": "chatTypeSecret",
|
||||||
|
"secret_chat_id": self.secret_chat_id,
|
||||||
|
"user_id": self.user_id}
|
||||||
|
elif self._value_ == 3:
|
||||||
|
return {"@type": "chatTypeSupergroup",
|
||||||
|
"supergroup_id": self.supergroup_id,
|
||||||
|
"is_channel": self.is_channel}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _missing_(cls, value: object):
|
||||||
|
if isinstance(value, dict):
|
||||||
|
if value['@type'] == 'chatTypeBasicGroup':
|
||||||
|
re = cls(0)
|
||||||
|
re.basic_group_id = int(value['basic_group_id'])
|
||||||
|
return re
|
||||||
|
elif value['@type'] == 'chatTypePrivate':
|
||||||
|
re = cls(1)
|
||||||
|
re.user_id = int(value['user_id'])
|
||||||
|
return re
|
||||||
|
elif value['@type'] == 'chatTypeSecret':
|
||||||
|
re = cls(2)
|
||||||
|
re.secret_chat_id = int(value['secret_chat_id'])
|
||||||
|
re.user_id = int(value['user_id'])
|
||||||
|
return re
|
||||||
|
elif value['@type'] == 'chatTypeSupergroup':
|
||||||
|
re = cls(3)
|
||||||
|
re.supergroup_id = int(value['supergroup_id'])
|
||||||
|
re.is_channel = bool(value['is_channel'])
|
||||||
|
return re
|
||||||
|
raise ValueError(f'Unknown value: {value}')
|
||||||
|
|
||||||
|
|
||||||
|
def json_object_hook(value):
|
||||||
|
try:
|
||||||
|
if isinstance(value, dict):
|
||||||
|
if '@type' in value:
|
||||||
|
if value['@type'].startswith('chatType'):
|
||||||
|
return ChatType(value)
|
||||||
|
except Exception:
|
||||||
|
print_exc()
|
||||||
|
return value
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
class TdLibJSONDecoder(JSONDecoder):
|
||||||
|
def __init__(self, *k, **kw) -> None:
|
||||||
|
super().__init__(*k, object_hook=json_object_hook, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
class TdLibJSONEncoder(JSONEncoder):
|
||||||
|
def default(self, o):
|
||||||
|
if isinstance(o, ChatType):
|
||||||
|
return dict(o)
|
||||||
|
return super().default(o)
|
||||||
|
|
||||||
|
|
||||||
class TdLib:
|
class TdLib:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self._initalized = False
|
self._initalized = False
|
||||||
@@ -114,7 +187,8 @@ class TdLib:
|
|||||||
async def _send(self, data):
|
async def _send(self, data):
|
||||||
extra = random()
|
extra = random()
|
||||||
data['@extra'] = extra
|
data['@extra'] = extra
|
||||||
data = dumps(data, ensure_ascii=False).encode()
|
en = TdLibJSONEncoder(ensure_ascii=False)
|
||||||
|
data = en.encode(data).encode()
|
||||||
_td_json_client_send(self._client_id, data)
|
_td_json_client_send(self._client_id, data)
|
||||||
while True:
|
while True:
|
||||||
if extra in self._re:
|
if extra in self._re:
|
||||||
@@ -125,7 +199,8 @@ class TdLib:
|
|||||||
def _update(self):
|
def _update(self):
|
||||||
result: bytes = _td_json_client_receive(self._client_id, 1.0)
|
result: bytes = _td_json_client_receive(self._client_id, 1.0)
|
||||||
if result:
|
if result:
|
||||||
re = loads(result.decode())
|
de = TdLibJSONDecoder()
|
||||||
|
re = de.decode(result.decode())
|
||||||
if '@extra' in re:
|
if '@extra' in re:
|
||||||
self._re[re['@extra']] = re
|
self._re[re['@extra']] = re
|
||||||
else:
|
else:
|
||||||
@@ -238,6 +313,15 @@ class TdLib:
|
|||||||
print(f"{re['code']} {re['message']}")
|
print(f"{re['code']} {re['message']}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
async def getChat(self, chat_id: int):
|
||||||
|
re = await self._send({"@type": "getChat", "chat_id": chat_id})
|
||||||
|
if re['@type'] == 'chat':
|
||||||
|
return re
|
||||||
|
else:
|
||||||
|
if re['@type'] == 'error':
|
||||||
|
print(f"{re['code']} {re['message']}")
|
||||||
|
return None
|
||||||
|
|
||||||
async def getMe(self):
|
async def getMe(self):
|
||||||
re = await self._send({"@type": "getMe"})
|
re = await self._send({"@type": "getMe"})
|
||||||
if re['@type'] == 'user':
|
if re['@type'] == 'user':
|
||||||
|
|||||||
@@ -42,6 +42,21 @@ async def main(lib: TdLib, arg):
|
|||||||
se.get("proxy"), se.get("phone_number")):
|
se.get("proxy"), se.get("phone_number")):
|
||||||
raise ValueError('Can not login')
|
raise ValueError('Can not login')
|
||||||
chat_id = arg.chat_id if arg.chat_id is not None else await get_chat_id_from_name(lib, arg.chat_name) # noqa: E501
|
chat_id = arg.chat_id if arg.chat_id is not None else await get_chat_id_from_name(lib, arg.chat_name) # noqa: E501
|
||||||
|
chat = await lib.getChat(chat_id)
|
||||||
|
if chat is None:
|
||||||
|
print('Chat not found.')
|
||||||
|
return -1
|
||||||
|
print('Chat information:')
|
||||||
|
print(f"Chat ID: {chat['id']}")
|
||||||
|
print(f"Chat Title: {chat['title']}")
|
||||||
|
print(f"Chat Type: {chat['type']}")
|
||||||
|
yes = False
|
||||||
|
if not yes:
|
||||||
|
inp = input('Do you want to delete messages in this chat?(y/n)')
|
||||||
|
if inp[0].lower() == 'y':
|
||||||
|
yes = True
|
||||||
|
if not yes:
|
||||||
|
return 0
|
||||||
re = await lib.deleteAllMyMessageInChat(chat_id, arg.start_time, arg.end_time) # noqa: E501
|
re = await lib.deleteAllMyMessageInChat(chat_id, arg.start_time, arg.end_time) # noqa: E501
|
||||||
print(re)
|
print(re)
|
||||||
return 0 if re else -1
|
return 0 if re else -1
|
||||||
|
|||||||
Reference in New Issue
Block a user