194 lines
7.5 KiB
Python
194 lines
7.5 KiB
Python
import json, time
|
||
|
||
class Tools:
|
||
def __init__(self):
|
||
pass
|
||
|
||
def generate_profile(
|
||
self, id=1, phone=70000000000, avatarUrl=None,
|
||
photoId=None, updateTime=0,
|
||
firstName="Test", lastName="Account", options=[],
|
||
description=None, accountStatus=0, profileOptions=[],
|
||
includeProfileOptions=True, username=None
|
||
):
|
||
contact = {
|
||
"id": id,
|
||
"updateTime": updateTime,
|
||
"phone": phone,
|
||
"names": [
|
||
{
|
||
"name": firstName,
|
||
"firstName": firstName,
|
||
"lastName": lastName,
|
||
"type": "ONEME"
|
||
}
|
||
],
|
||
"options": options,
|
||
"accountStatus": accountStatus
|
||
}
|
||
|
||
|
||
if avatarUrl:
|
||
contact["photoId"] = photoId
|
||
contact["baseUrl"] = avatarUrl
|
||
contact["baseRawUrl"] = avatarUrl
|
||
|
||
if description:
|
||
contact["description"] = description
|
||
|
||
if username:
|
||
contact["link"] = "https://max.ru/" + username
|
||
|
||
if includeProfileOptions == True:
|
||
return {
|
||
"contact": contact,
|
||
"profileOptions": profileOptions
|
||
}
|
||
else:
|
||
return contact
|
||
|
||
def generate_chat(self, id, owner, type, participants, lastMessage, lastEventTime):
|
||
"""Генерация чата"""
|
||
# Генерируем список участников
|
||
result_participants = {
|
||
str(participant): 0 for participant in participants
|
||
}
|
||
|
||
result = None
|
||
|
||
# Генерируем нужный список в зависимости от типа чата
|
||
if type == "DIALOG":
|
||
result = {
|
||
"id": id,
|
||
"type": type,
|
||
"status": "ACTIVE",
|
||
"owner": owner,
|
||
"participants": result_participants,
|
||
"lastMessage": lastMessage,
|
||
"lastEventTime": lastEventTime,
|
||
"lastDelayedUpdateTime": 0,
|
||
"lastFireDelayedErrorTime": 0,
|
||
"created": 1,
|
||
"joinTime": 1,
|
||
"modified": lastEventTime
|
||
}
|
||
|
||
# Возвращаем
|
||
return result
|
||
|
||
async def generate_chats(self, chatIds, db_pool, senderId):
|
||
"""Генерирует чаты для отдачи клиенту"""
|
||
# Готовый список с чатами
|
||
chats = []
|
||
|
||
# Формируем список чатов
|
||
for chatId in chatIds:
|
||
async with db_pool.acquire() as db_connection:
|
||
async with db_connection.cursor() as cursor:
|
||
# Получаем чат по id
|
||
await cursor.execute("SELECT * FROM `chats` WHERE id = %s", (chatId,))
|
||
row = await cursor.fetchone()
|
||
|
||
if row:
|
||
# Получаем последнее сообщение из чата
|
||
message, messageTime = await self.get_last_message(
|
||
chatId, db_pool
|
||
)
|
||
|
||
# Формируем список участников
|
||
participants = {
|
||
str(participant): 0 for participant in row.get("participants")
|
||
}
|
||
|
||
# Выносим результат в лист
|
||
chats.append(
|
||
{
|
||
"id": row.get("id"),
|
||
"type": row.get("type"),
|
||
"status": "ACTIVE",
|
||
"owner": row.get("owner"),
|
||
"participants": participants,
|
||
"lastMessage": message,
|
||
"lastEventTime": messageTime,
|
||
"lastDelayedUpdateTime": 0,
|
||
"lastFireDelayedErrorTime": 0,
|
||
"created": 1,
|
||
"joinTime": 1,
|
||
"modified": messageTime
|
||
}
|
||
)
|
||
|
||
# Получаем последнее сообщение из избранного
|
||
message, messageTime = await self.get_last_message(
|
||
senderId, db_pool
|
||
)
|
||
|
||
# Хардкодим в лист чатов избранное
|
||
chats.append(
|
||
{
|
||
"id": 0,
|
||
"type": "DIALOG",
|
||
"status": "ACTIVE",
|
||
"owner": senderId,
|
||
"participants": {
|
||
str(senderId): 0 # if not messageTime else messageTime
|
||
},
|
||
"lastMessage": message,
|
||
"lastEventTime": messageTime,
|
||
"lastDelayedUpdateTime": 0,
|
||
"lastFireDelayedErrorTime": 0,
|
||
"created": 1,
|
||
"joinTime": 1,
|
||
"modified": messageTime
|
||
}
|
||
)
|
||
|
||
return chats
|
||
|
||
async def insert_message(self, chatId, senderId, text, attaches, elements, cid, type, db_pool):
|
||
"""Добавление сообщения в историю"""
|
||
async with db_pool.acquire() as db_connection:
|
||
async with db_connection.cursor() as cursor:
|
||
# Получаем id последнего сообщения в чате
|
||
await cursor.execute("SELECT id FROM `messages` WHERE chat_id = %s ORDER BY time DESC LIMIT 1", (chatId,))
|
||
|
||
row = await cursor.fetchone() or {}
|
||
last_message_id = row.get("id") or 0 # последнее id сообщения в чате
|
||
|
||
# Вносим новое сообщение в таблицу
|
||
await cursor.execute(
|
||
"INSERT INTO `messages` (chat_id, sender, time, text, attaches, cid, elements, type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
|
||
(chatId, senderId, int(time.time() * 1000), text, json.dumps(attaches), cid, json.dumps(elements), type)
|
||
)
|
||
|
||
message_id = cursor.lastrowid # id сообщения
|
||
|
||
# Возвращаем айдишки
|
||
return int(message_id), int(last_message_id)
|
||
|
||
async def get_last_message(self, chatId, db_pool):
|
||
"""Получение последнего сообщения в чате"""
|
||
async with db_pool.acquire() as db_connection:
|
||
async with db_connection.cursor() as cursor:
|
||
# Получаем id последнего сообщения в чате
|
||
await cursor.execute("SELECT * FROM `messages` WHERE chat_id = %s ORDER BY time DESC LIMIT 1", (chatId,))
|
||
|
||
row = await cursor.fetchone()
|
||
|
||
# Если нет результатов - возвращаем None
|
||
if not row:
|
||
return None, None
|
||
|
||
# Собираем сообщение
|
||
message = {
|
||
"id": row.get("id"),
|
||
"time": int(row.get("time")),
|
||
"type": row.get("type"),
|
||
"sender": row.get("sender"),
|
||
"text": row.get("text"),
|
||
"attaches": json.loads(row.get("attaches")),
|
||
# "reactionInfo": {}
|
||
}
|
||
|
||
# Возвращаем
|
||
return message, int(row.get("time")) |