Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PDA: Messenger program system #48

Merged
merged 9 commits into from
Aug 3, 2023

Conversation

TokDenis
Copy link

PDA: Messenger program system

Добавил мессенджер программу для cartridge системы.
MessengerCartridgeComponent - хранит полученные сообщения и информацию о пользователе программы
MessengerCartridgeSystem - использует DeviceNetworkSystem для общения между мессенджерами, подробнее можно почитать в комментариях самой системы

Проблемы

  1. Хранение в MessengerCartridgeComponent только полученных сообщений выглядит логично, что бы не задваивать данные. Но не слишком удобно для получения от туда данных.
  2. Есть идея заменить\дополнить MessengerCartridgeComponent чем то вроде MessengerServerComponent который и будет выступать в роле хранилища сообщений. Его можно будет поставить на карте, можно будет выключить, украсть или взять данные по чужим чатам и т.д.
  3. Как первый этап Canvas говорил что можно использовать за сервер TelecomServer.
  4. Есть проблема с получением имени члена экипажа, ид карта не инициализирована при OnInstall программы с мессенджером.
  5. Мы хотим вообще использовать DeviceNetworkSystem или работать без этого?
  6. Может ли пользователь менять имя? Локально для себя можно будет менять имя контактов, в перспективе.

TODO

  1. Добавление нового контакта при прилете с шатла. т.е. смене network сети.
  2. Интерфейс тестовый, сделаем красиво как с функционалом определимся.
  3. Пиликать рингтоном при получение сообщения. (главная фича в общем то)

Медиа
1
2
3

Проверки

  • PR полностью завершён и мне не нужна помощь чтобы его закончить.
  • Я внимательно просмотрел все свои изменения и багов в них не нашёл.
  • Я запускал локальный сервер со своими изменениями и всё протестировал.
  • Я добавил скриншот/видео демонстрации PR в игре, или этот PR этого не требует.

Изменения

  • add: MessengerCartridgeComponent
  • add: MessengerCartridgeSystem

@github-actions github-actions bot added Changes: Localization Изменение затронуло файлы ".ftl" Changes: UI Изменение затронуло файлы ".xaml" labels May 31, 2023
@TokDenis TokDenis changed the title PDA: Messenger program system DRAFT: PDA: Messenger program system May 31, 2023
@TokDenis TokDenis changed the title DRAFT: PDA: Messenger program system PDA: Messenger program system May 31, 2023
@TokDenis
Copy link
Author

TokDenis commented Jun 1, 2023

Обсуждение по месенджеру:

  1. Храним сообщения централизовано в сервере типа TelecomServer, назовем как нибудь MessendgerServer.
  2. Храним так же информацию о пользователе что бы если сломается пда, мы смогли достать чат.
  3. Враги прилетающие на станцию не будут подключаться к серверу, посмотреть на использование FactionComponent.
    а. проверить не будет ли атаковать турель такой pda.
    b. вынести FactionComponent в общий, а не только для NPC.
  4. Карта - аутенфицирует пользователя в месенджере, можно вставить в чужой пда и прочитать свои сообщения.

@Redict Redict marked this pull request as draft June 6, 2023 16:51
@rincew1nd
Copy link

Немного дополнительной информации.
Посчитал эту задачи интересной и полезной в освоении базового UI, обмена сообщениями и эвентами.
В итоге уделил часов 10 своего времени и накидал рабочий прототип который можно допилить:
https://github.com/rincew1nd/space-station-14/tree/messenger-cartridge-system

Что было сделано:

  • Базовый UI
  • Регистрация пользователей в системе при наличии Id карты в PDA
  • Онлайн статус пользователя
  • Отправка сообщений пользователям, получение истории сообщений
  • Кеш сообщений работает только в пределах одной станции

Что нужно сделать:

  • Красивый UI
  • Кеш сообщений на стороне пользователя для сокращения трафика Server-Client
  • Оповещение получателей о новых сообщениях
  • Оповещение отправителей о неудачной доставке (пользователь офлайн)
  • Обновление имени при его изменении на Id карте (если такое вообще возможно)
  • Получение истории переписки с других станций, если она была
  • Сброс истории сообщений в конце раунда
  • Возможно: терминал на станции через который можно посмотреть переписку, требует доступы
  • Возможно: добавить проверку рейнджа до ближайшего терминала что бы не давать смотреть историю сообщений в дали от станции

@Redict
Copy link
Collaborator

Redict commented Jun 7, 2023

@rincew1nd @TokDenis синканитесь по задаче тогда

@rincew1nd
Copy link

@rincew1nd @TokDenis синканитесь по задаче тогда

Мы уже. Я ему отдал исходники 3 дня назад. Просто решил сюда продублировать.

@github-actions github-actions bot added the Merge Conflict Some content has conflicts. label Jun 7, 2023
@github-actions
Copy link

github-actions bot commented Jun 7, 2023

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions github-actions bot removed the Merge Conflict Some content has conflicts. label Jun 20, 2023
@TokDenis
Copy link
Author

  • Переделал UI
  • Звук рингтона при новом сообщение
  • Локализовал
  • Стейт +- эффективно отправляется. При первом открытии отправляется весь стейт, далее только отсутствующие.
  • Аутентификация ID картой. Можно расширить.
  • Авторизация системой AccessReader
  • Добавил два прототипа сервера Nanotrasen и синдиката
  • Мессенджер основан на чатах и их участниках. Можно расширить чаты до групп, каналов и тд

Общий вид (не прочитанное сообщение выделяется желтым)
image
image

Поиск по чатам и сообщениям
image

Избранное (чат с самим собой)
image

@Redict
Copy link
Collaborator

Redict commented Jun 21, 2023

Ready for review?

@TokDenis
Copy link
Author

Ready for review?

Yes

@Redict Redict requested a review from rincew1nd June 22, 2023 10:05
@Redict Redict marked this pull request as ready for review June 22, 2023 10:06
description: A machine printed circuit board for a messenger server.
components:
- type: MachineBoard
prototype: CrewMonitoringServer

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем добавлять CrewMonitoringServer компонент к мессенджер серверу?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Копипаста, поправлю

- type: StationLimitedNetwork
- type: DeviceNetwork
deviceNetId: Wireless
receiveFrequencyId: MessengerClient

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нельзя заюзать уже существующие волны для PDA?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я пробовал, но тк сам клиент работает как отдельный компанент я решил не засорять пда и тем более можно накинуть клиент на любое entity и прописать логику работы. Как пример - консоль с которой можно отправить сообщения или вендинговый автомат который отправляет всем рекламу...

@@ -63,6 +63,7 @@
softness: 5
autoRot: true
- type: Ringer
- type: StationLimitedNetwork

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ты ограничиваешь работу всего ПДА до одной станции. Если я не ошибаюсь, у тебя может быть несколько станций за один раунд, что приведёт к тому, что твой ПДА будет картошкой на других станциях.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, ограничение работает на текущю станцию (как я понял, можешь посмотреть), т.е. если ты перейдешь в другую станцию и там будет другой сервер, то пда свяжется с ним, а не будет отправлять сообщения на все сервера на карте.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Посмотрел по коду. Да ограничивает в пределах текущей станции на которой находишься. т.е. перейдешь на другую сеть сменится на сеть станции на которую перешел.

range: 500
- type: MessengerServer
serverName: "Nanotrasen Messenger Server"
- type: AccessReader

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Любой человек может зааксессить данные ислючая синдикат?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, (если у него тег !NuclearOperative) сейчас как я понял из вражеских доступов только NuclearOperative.

denyTags: [ "NuclearOperative" ]

- type: entity
id: PDASyndicateMessengerServer

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем отдельный сервер для синдиката?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как пример. Вроде у них есть свой корабль, не? Туда установить можно.

BroadcastCommand(uid, args.Loader, MessengerClientCommandCheckServer);
}

private void BroadcastCommand(EntityUid senderUid, EntityUid loaderUid, string command)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я правильно понял что ты оповещаешь все сервера о том что игрок поставил картридж?
Это в какой-то степени не правильно, так как игрок находится только на какой-то станции и может быть вне ренджа сервера.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть компонент StationLimitedNetwork он это отслеживает. Ренж отслеживает вроде WirelessNetworkConnection

case MessengerClientCartridgeSystem.MessengerClientCommandCheckServer:
{
// check authorization to server before registration
if (!AccessCheck(uid, args.Data))

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Заведи классы, которые будут соответствовать данным для каждого события, клади их в args.Data с каким-нибудь нужным тебе ключём, конверти в нужный тип на сервере и не мучайся с парсерами.
if (args.Data.ContainsKey("payload") && args.Data["payload"] is PayloadType payload)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Немного не понял. Можешь подробнее? Это обязательно нужно в текущей итерации?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В шарпе все классы это object. Object можно конвертнуть обратно в классы, так как object знает какой он был классом.
Если сделать ‘’’if(object is NewClass classObj)’’’, то код зайдёт в if только если объект нужного типа и конвертнулся нормально, а classObj будет заполнен инстансом.

args.Data это объект, который можно сделать отдельным классом на каждый тип ивентов. А потом смотреть на тип ивента и понимать в какой класс нужно конвертнуть данные. Если конвертация упала, то что-то пошло не так.

var message = new MessengerMessage(chatKey.Id, contactKey.Id, _gameTiming.CurTime, messageText);
var messageKey =
component.AddMessage(message);
message.Id = messageKey.Id;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Айдишник должен заполняться внутри AddMessage. Передай с ref message

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

До записи в компонент ид не известно.

// and chats with every entity client
var chatsList = new List<ChatKey>();

foreach (var (_, contact) in component.GetClientToContact())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Огромное колличество мусорных объектов в памяти. Зачем создавать чаты которых пока ещё даже нет.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не такое уж и огромное. Так проще и расширять понятнее. Вот есть контакты, вот есть чаты, в чатах есть их члены и сообщения. Сообщения тоже отдельно хранятся. В общем небольшая база данных.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Окей. Видимо нужно учитывать что это не высоконагруженный сервак и у нас не десятки тысяч человек, наверно сможем выделить лишнюю память на кеш под раунд.

if (!Resolve(uid, ref component))
return;

switch (command)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Энум

@rincew1nd
Copy link

Посмотрел всё что касается сервера. UI не смотрел, не осталось свободного времени.

@rincew1nd
Copy link

Ещё тестов нет и они падают

@KashRas
Copy link

KashRas commented Jun 26, 2023

Выдаёт постоянно ошибку, мол, сервер не найден.

@TokDenis
Copy link
Author

Выдаёт постоянно ошибку, мол, сервер не найден.

Я на карту не добавлял. В поиске entity найди мессенджер и установи, клиент подключится при открытие UI

@KashRas
Copy link

KashRas commented Jun 27, 2023

Выдаёт постоянно ошибку, мол, сервер не найден.

Я на карту не добавлял. В поиске entity найди мессенджер и установи, клиент подключится при открытие UI

Всё равно не видит сервер. К тому же, я его добавлял.

@github-actions
Copy link

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions github-actions bot added the Merge Conflict Some content has conflicts. label Jul 15, 2023
@github-actions github-actions bot added Merge Conflict Some content has conflicts. and removed Merge Conflict Some content has conflicts. labels Jul 16, 2023
@github-actions
Copy link

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@aw-c
Copy link

aw-c commented Jul 17, 2023

@TokDenis привет, есть что доделывать и мёржить или закрывать?

@TokDenis
Copy link
Author

@TokDenis привет, есть что доделывать и мёржить или закрывать?

Нужно доделать правки на которые указал rincew1nd, я напишу в дискорде когда будет готово. Думаю на неделе выделю несколько часиков

@github-actions github-actions bot removed the Merge Conflict Some content has conflicts. label Jul 28, 2023
@github-actions github-actions bot added the Merge Conflict Some content has conflicts. label Jul 29, 2023
@github-actions
Copy link

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions github-actions bot removed the Merge Conflict Some content has conflicts. label Jul 30, 2023
@aw-c aw-c merged commit 0fd29da into SerbiaStrong-220:master Aug 3, 2023
12 checks passed
@TokDenis
Copy link
Author

TokDenis commented Aug 3, 2023

Инструкция как поставить сервер что бы работало

Ищем сервер для сообщений и ставим в нужное место
photo_2023-08-03_12-06-41

Проверяем работает открывая приложение в пда
photo_2023-08-03_12-06-48

stalengd pushed a commit to stalengd/space-station-14 that referenced this pull request Oct 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changes: Localization Изменение затронуло файлы ".ftl" Changes: UI Изменение затронуло файлы ".xaml" Status: Needs Review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants