v6
This commit is contained in:
BIN
backend/docs/api.xls
Normal file
BIN
backend/docs/api.xls
Normal file
Binary file not shown.
12
backend/docs/public.txt
Normal file
12
backend/docs/public.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Описание ПО
|
||||
|
||||
Программа состоит из двух частей: бота и приложение miniapp, привязанное к боту. Приложение отображает проекты для пользователя, задачи и встречи на проекте, прикрепленные к ним файлы, а также список тех, с кем пользователь пересекался в группах. Бот отслеживает не только участников группы, но и при наличии админских прав в группе, пересылаемые файлы и сообщения для резервного копирования.
|
||||
|
||||
Термины
|
||||
Клиенты - специальные аккаунты для организаций, регистрируемые в miniapp, позволяющие управлять проектами и контактами на них.
|
||||
Пользователи - пользователи Telegram, участвующие в одной или нескольких группах где есть бот. Пользователи могут заходить в miniapp и
|
||||
|
||||
После добавления бота в группу, группа привязывается к специальному внутреннему клиенту, который имеет только один проект "Вне проектов". Администратор группы может
|
||||
|
||||
После добавления в группу и привязки токеном к аккаунту клиента, бот отслеживает новые сообщения в группе. При обнаружении файла он копируется с специальную группу, указанную клиентом, и регистрирует его в списке файлов, доступных для участников группы. Бот не хранит ни сами файлы, ни сообщения.
|
||||
|
||||
93
backend/docs/questions.txt
Normal file
93
backend/docs/questions.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
id-телеграма могут быть больше 32-битного int, поэтому лучше использовать свои id + кеш, который позволит быстро конвертировать одни id в другие. Хотя может быть использование BigInt будет достаточно. Большие id могут негативно сказаться на скорости выборки данных и индексировании.
|
||||
|
||||
A: Будут использоваться свои id, а ID Telegram записиываться в отдельные колонки.
|
||||
-----------------------------------------------------
|
||||
По хорошему для каждого customer надо иметь свою базу. Поскольку для отображения данных проекта требуется информация только именно этого customer, то информация может быть локализвана. При этом остается общая база, в которой хранится список пользователей (таблица users) и информация, необходимая для формирования первой сводной страницы, напр. общее число незавершенных задач и календарь совещаний, а также id-клиентов, у которых пользователь участвует/вал в проектах.
|
||||
? Можно ли сделать так, чтобы клиент имел свою установку, но при этом пользователи обращались к нашему боту/miniapp?
|
||||
Если данные запрашивать не напрямую из базы, а по http/https, то каждый узел будет иметь свою базу.
|
||||
-----------------------------------------------------
|
||||
Хотелось бы не хранить сообщения локально. А запрашивать их за день и отправлять их бекап в специальную группу. Бот имеет ограничение 20-30 запросов в секунду, т.е. за минуту бот может получить данные из 1200 чатов.
|
||||
|
||||
A: Не хранить сообщения. Запрашивать их, если клиент установил настройку.
|
||||
-----------------------------------------------------
|
||||
При удалении проекта/задачи/встречи/компании надо также чистить links. Возможно лучше сделать отдельные таблицы для каждой связки, чтобы использовать FK + delete cascade
|
||||
|
||||
A: Операция выполняется DELETE CASCADE автоматически
|
||||
-----------------------------------------------------
|
||||
ФИО пользователей задает customer и ФИО в адресной книге всегда показывается. Телефон задает пользователь и пользователь может указать на каком проекте его показывать, а где нет. По умолчанию "Не показывать"
|
||||
<- может храниться в users.is_show_phone = [project_id1, project_id3]
|
||||
|
||||
A: Хранится в настойках пользователя в таблице users
|
||||
-----------------------------------------------------
|
||||
Если пользователь изменил задачу, то у тех, у кого она есть в миниаппе, должны получить по ней обновление. Вопрос в том, как маякнуть клиенту, что что-то обновилось?
|
||||
Два варианта: клиент должен запрашивать обновления скажем раз в минуту или же использовать WebSocket. Есть вероятность, что для сервера поддерживать кучу WebScoket слишком накладно.
|
||||
-----------------------------------------------------
|
||||
Не делать API, который возвращает одну сущность, а только список.
|
||||
Если надо сущность, то можно /api/project?id=1
|
||||
Или можно использовать redirect с /api/project/:id на /api/project?id=1
|
||||
|
||||
A: Да
|
||||
-----------------------------------------------------
|
||||
Кто заполняет ФИО пользователя? Если админ, тогда возможна ситуация, когда на проекте одного админа человек будет с ФИО, а на проекте другого - нет. Возможно ФИО также должен заполнять сам пользователь. По сути есть некоторая дыра, когда пользователь предоставляет ФИО, телефон и номер телеграма всем желающим,
|
||||
когда можно заманить человека в группу с ботом и узнать его личные данные.
|
||||
|
||||
A: Фамилию задает клиент отдельно на каждом проекте. А также роль и департамент.
|
||||
-----------------------------------------------------
|
||||
Польщователь сам решает показывать ли ему ФИО и/или телефон на
|
||||
проектах конкретного админа системы.
|
||||
|
||||
А: Пользователь решает только про телефон
|
||||
-----------------------------------------------------
|
||||
Добавить документы может любой из участников. Удалять можно только своё или если создатель.
|
||||
|
||||
A: Да.
|
||||
-----------------------------------------------------
|
||||
Если переслать документ боту, то бот спросит к какой задаче прикрепить. Автор в этом случае тот, кто переслал сообщение.
|
||||
|
||||
A: В пересылаем соообщении нет информации о том, откуда оно было получено, соотв. нельзя определить к какому проекту относится пересылаемое напрямую. Как вариант - использовать последний проект, где пользователь отправил сообщение в группе + кнопка Другой проект.
|
||||
Если бот не имеет админских прав, то это будет плохо работать.
|
||||
-----------------------------------------------------
|
||||
Предположим, что бота добавляют в группу А. Что делать, если не все в группе используют бота/miniapp?
|
||||
-----------------------------------------------------
|
||||
Если бот не получает админских прав, то привязать группу токеном не получится, т.к. бот не видит сообщений. Можно сделать, чтобы пользователь отправил комманду /attach<token>. Пока передать параметр в команду невозможно.
|
||||
https://gram.js.org/tl/bots/SetBotCommands
|
||||
|
||||
|
||||
Для отправки пользователям сообщений бот должен знать не только их id, но и accessHash. Аналогично для отправки сообщения в чат или скачивания файла, т.е. надо хранить еще и это поле.
|
||||
Когда пользователь отписывается от бота, то надо обнулять его hash. В адресной книге тех, к кому у бота нет доступа, т.е. они участники группы, но у них нет бота, отображать специальным образом.
|
||||
|
||||
А: если у того, кому назначили задачу, нет бота и следовательно accessHash, то можно отправлять в один из чатов, в котором участвуют создатель и ответственный, возможно отсортировав по времени последнего сообщения от каждого из них. Наблюдатели должны использовать бота.
|
||||
-----------------------------------------------------
|
||||
Возможно дать некоторым пользователям добавлять группы к проекту самостоятельно, путем нажатия кнопки "Добавить группу".
|
||||
-----------------------------------------------------
|
||||
В uTasks поначалу отображали только задачи, связанные с пользователем, потом они добавили крыж "Показывать все задачи" по просьбам пользователей. Почему пользователям это понадобилось? Возможно потому что у них нет механизма наблюдателей.
|
||||
Возможно нужно для контроля начальником => отдельное приложение
|
||||
-----------------------------------------------------
|
||||
Предположим, что бот был в группе, а потом его удалили из нее.
|
||||
Должна ли группа отображаться в списке групп проекта?
|
||||
-----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
69
backend/docs/telegram.txt
Normal file
69
backend/docs/telegram.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
const { Api, TelegramClient } = require('telegram')
|
||||
const { StringSession } = require('telegram/sessions')
|
||||
const session = new StringSession('')
|
||||
|
||||
const apiId = 26746106
|
||||
const apiHash = '29e5f83c04e635fa583721473a6003b5'
|
||||
const BOT_TOKEN = '7236504417:AAGVaodw3cRwGlf-jAhwnYb51OHaXcgpW8k';
|
||||
|
||||
const client = new TelegramClient(session, apiId, apiHash, {})
|
||||
|
||||
(async function run() {
|
||||
await client.start({botAuthToken: BOT_TOKEN})
|
||||
...
|
||||
})()
|
||||
|
||||
Получение информации о себе
|
||||
const result = await client.getEntity("me")
|
||||
|
||||
Группа при создании имеет тип group. Её id выглядит как -4646437202
|
||||
Для получения информации надо отбросить минус
|
||||
const result = await client.getEntity(new Api.PeerChat({ chatId: 4646437202n }))
|
||||
Для получения пользователей и описания
|
||||
const result = await client.invoke(new Api.messages.GetFullChat({chatId: 4646437202n}))
|
||||
|
||||
После включения топиков группа меняется на канал и её id становится вида -1002496664184
|
||||
Для получения информации
|
||||
const result = await client.getEntity(new Api.PeerChannel({ channelId: -1002496664184n }))
|
||||
При этом аттрибут forum = true
|
||||
Если топики отключить, то id и класс уже не меняется, но forum = false
|
||||
Для получения списка пользователей канала
|
||||
const channel = new Api.PeerChannel({ channelId: -1002496664184n })
|
||||
const result = await client.invoke(
|
||||
new Api.channels.GetParticipants({
|
||||
channel,
|
||||
filter: new Api.ChannelParticipantsRecent(),
|
||||
limit: 999999,
|
||||
offset:0 ,
|
||||
})
|
||||
)
|
||||
|
||||
Скачивание файла из сообщения на диск
|
||||
client.addEventHandler(async (update) => {
|
||||
const msg = update.message
|
||||
if (msg?.className == 'Message') {
|
||||
const buffer = await client.downloadMedia(msg, {})
|
||||
fs.writeFileSync("d:/CODES/Telegram/tmp/file", buffer)
|
||||
}
|
||||
|
||||
}, new NewMessage({}));
|
||||
|
||||
Примеры кода
|
||||
Получение списка пользователей в супергруппе
|
||||
https://gist.github.com/waptik/9de410055eac8a60668ce7ac1e5183ac
|
||||
|
||||
Ссылка для выбора группы - https://qna.habr.com/q/1374460
|
||||
|
||||
У пользователя есть Name = First Name + Last Name - обязательно, а также username - опционально для t.me/username
|
||||
|
||||
Выбор куда отправить - ForwardTo - https://core.telegram.org/widgets/share
|
||||
|
||||
Размеры превьюшек - https://core.telegram.org/api/files#stripped-thumbnails
|
||||
|
||||
you can just pass an ID.
|
||||
if channel/superroup => add -100
|
||||
if group add => -
|
||||
if user don't add anything
|
||||
for example for your test group2 it would be
|
||||
client.sendMessage(-463172658,{params})
|
||||
https://github.com/gram-js/gramjs/issues/146#issuecomment-913528553
|
||||
Reference in New Issue
Block a user