Giter VIP home page Giter VIP logo

tcpchat's Introduction

TCPChat

alt tag

Description:

Multi-user chat with mixed architecture: client-server, p2p. Server works tightly with certificates. Server and users should have certificates. But program can generate self signed certificates that supports too, but with some peculiarities.

First of all if server has self-signed certificate then users those connect to him will be warned. Users also can use self-signed certificates, if them have it, then them will be marked with the appropriate icons in users list. Also user can save certificates to local trusted TCPChat storage.

Here is this user icons:

  1. alt tag This is approved certificate. This certificate is valid or it was saved in local TCPChat trusted certificates storage. Also user nick match to certificate common name.
  2. alt tag This is also approved certificate, but nick does't match to certificate common name.
  3. alt tag This is not approved self-signed certificate.

Main idea:

Main idea of this project - is multiple servers without databases. Where you can find friends and recognize that this is really them with he help of certificates.

Supports:

  1. Full trafic encryption. Key exchange with certificates. AES-256 CBC.
  2. Private messages. (P2P)
  3. Rooms.
  4. Voice chat. (P2P)
  5. Files sharing. (P2P)
  6. Plugins (Example of simple plugin: https://github.com/Nirklav/ScreenshotPlugin).

P2P means that connection is established directly between clients without server.

OpenAL required for audio services. You can download it from official site.

tcpchat's People

Contributors

nirklav avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tcpchat's Issues

Использование как встраиваемый плагин

Здравствуйте! Очень нравится ваш проект и давно посматриваю как идет разработка. Есть такие вопросы:

  • Возможно ли использовать ваш проект, в качестве встраиваемого модуля (плагина) в рамках другого проекта?
  • Можно ли присоединиться, если будут какие-то идеи для улучшения или дополнения?
  • При желании сделать кросс-платформенный клиент на базе Eto-фреймворка - это лучше будет делать только в форке, или вы примете такой клиент (как альтернативный) в основной проект (может кто-нибудь еще сделает клиент на базе Avalonia или XWT)?
  • Самое интересное для меня: можно ли сделать дополнительную P2P фичу - обнаружение пирами друг друга на основе DHT или другой основе, чтобы не иметь специализированного сервера вообще?
  • Возможно ли сделать на базе протокола вашего проекта такой плагин (плагин чата, работающий параллельно с ним), чтобы передавать сильно специализированную информацию (не файлы, и не сообщения или звук)?

Param not found.

hi.
System.InvalidOperationException: "Param not found: 127.0.0.1:10021"

Windows Forms

Это не составит труда перестроить для WF? Или там много чего в коде зависимо от библиотек WPF?

Error in input values

No matter what i do when i try to create a server it just closes the window and says "Error in input values".This didn't happen in the pre-certificate versions. I have a feeling that I've missed something obvious but if not a guide on how to create your own servers properly would help.

Create voice chat with configured server

Hello.
First of all, its nice to see your work on this TCP Chat because its work really great.
I am creating a private games that required only Voice Chat.
I would like to request a voicechat window for my games with configured server instead of p2p multiserver. I don't mind if you want to create the voice chat server as opensource.
the simple function i would like to request :

  • Simple login forms with encryption hash sha256 (MYSQL) or others.
  • Push button to chat for player configured button or default buttons.
  • Make Voice Chat windows forms always appear transparent on the front even players are playing the game.
  • Ability to block voice chat in certain time. (for admin)

I can push up some milestone for the project.
Let me know if you are intrested with the project your email/skype or anykind of contact so that i can discuss this matter with you.

Program can't initialize sound devices

Notebook: Lenovo g480
OS: windows10 1803
Last release.
I don't see my microphone and headphones in settings.
If I close settings or connect to server, I see this dialog: Audio system not initialized. Voice chat disabled.

Release

Привет! Где можно найти уже готовый скомпилированный файл, для сервака или клиента?

Загрузка файла

Добрый день, не подскажите, в какую сторону копать, проблема вот в чем : при попытке загрузить файл в комнату client.AddFileToRoomAsyc($"Main room", newfilename); Выдает ошибку "пользователь уже раздает этот файл", хотя этот файл я гружу впервые, проблема решается перезапуском сервера или нужно добавить файл в комнату, потом убрать его с раздающих и опять добавить. Не подскажите, где может быть проблема ?

п.с Использую версию 1,5, т.к не хочу с ехе тащить еще длл

different subnet trans file failed

Enviroment

Server started with public IP

if Client A and Client B in same subnet ,download file function work correctly

if Client A and Client B in different subnet ,message can receive,but download file failed!file size stop at 0 bytes!

Here is log

ClientA:

Client.log

Time: 2020/10/15 11:07:58 DEBUG: Connecting directly to Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB...
Time: 2020/10/15 11:07:58 DEBUG: AsyncPeer.ConnectToService(47.96.69.160:10022)
Time: 2020/10/15 11:07:58 DEBUG: AsyncPeer.ServiceConnect()
Time: 2020/10/15 11:07:58 DEBUG: AsyncPeer.WaitConnection(172.24.224.1:58409)
Time: 2020/10/15 11:07:58 DEBUG: ClientWaitPeerConnectionCommand: 172.24.224.1|53324|User:81278742EBB8C17114312EA2DAF02AEB9EC198EB|Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB
Time: 2020/10/15 11:07:59 DEBUG: AsyncPeer.ConnectToPeer(Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB, 172.24.224.1:53324)
Time: 2020/10/15 11:07:59 DEBUG: ClientConnectToPeerCommand: Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB|172.24.224.1:53324
Time: 2020/10/15 11:07:59 DEBUG: AsyncPeer.PeerConnected(User:81278742EBB8C17114312EA2DAF02AEB9EC198EB)
Time: 2020/10/15 11:07:59 DEBUG: AsyncPeer.PeerConnected(Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB)
Time: 2020/10/15 11:11:57 DEBUG: AsyncPeer.ConnectToService(47.96.69.160:10022)
Time: 2020/10/15 11:11:57 DEBUG: AsyncPeer.ServiceConnect()
Time: 2020/10/15 11:11:57 DEBUG: AsyncPeer.WaitConnection(36.23.115.101:20076)
Time: 2020/10/15 11:11:57 DEBUG: ClientWaitPeerConnectionCommand: 202.107.200.171|58081|Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB|DJ:81278742EBB8C17114312EA2DAF02AEB9EC198EB

UnhandledError.log

Time: 2020/10/15 11:06:56;
Type: System.NullReferenceException;
Message: 未将对象引用设置到对象的实例。;
StackTrace:
在 Engine.Network.AsyncPeer.Finder.Equals(NetConnection connection) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 500
在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 source, Func2 predicate)
在 Engine.Network.AsyncPeer.FindConnection(UserId id) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 485
在 Engine.Network.AsyncPeer.SendMessage(UserId peerId, IPackage package, Byte[] rawData, Boolean unreliable) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 312
在 Engine.Network.AsyncPeer.OnPeerConnected(NetIncomingMessage message) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 600
在 Engine.Network.AsyncPeer.OnReceive(Object obj) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 533
在 Engine.Helpers.EngineSyncContext.Event.Dispatch() 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Helpers\EngineSyncContext.cs:行号 38
在 Engine.Helpers.EngineSyncContext.ThreadFunc(Object state) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Helpers\EngineSyncContext.cs:行号 123
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
在 System.Threading.ThreadPoolWorkQueue.Dispatch()

ClientB

Client.log

Time: 2020/10/15 11:07:58 DEBUG: Connecting directly to Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB...
Time: 2020/10/15 11:07:58 DEBUG: AsyncPeer.ConnectToService(47.96.69.160:10022)
Time: 2020/10/15 11:07:58 DEBUG: AsyncPeer.ServiceConnect()
Time: 2020/10/15 11:07:58 DEBUG: AsyncPeer.WaitConnection(172.24.224.1:58409)
Time: 2020/10/15 11:07:58 DEBUG: ClientWaitPeerConnectionCommand: 172.24.224.1|53324|User:81278742EBB8C17114312EA2DAF02AEB9EC198EB|Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB
Time: 2020/10/15 11:07:59 DEBUG: AsyncPeer.ConnectToPeer(Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB, 172.24.224.1:53324)
Time: 2020/10/15 11:07:59 DEBUG: ClientConnectToPeerCommand: Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB|172.24.224.1:53324
Time: 2020/10/15 11:07:59 DEBUG: AsyncPeer.PeerConnected(User:81278742EBB8C17114312EA2DAF02AEB9EC198EB)
Time: 2020/10/15 11:07:59 DEBUG: AsyncPeer.PeerConnected(Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB)
Time: 2020/10/15 11:10:41 DEBUG: Connecting directly to DJ:81278742EBB8C17114312EA2DAF02AEB9EC198EB...
Time: 2020/10/15 11:10:41 DEBUG: AsyncPeer.ConnectToPeer(DJ:81278742EBB8C17114312EA2DAF02AEB9EC198EB, 202.107.200.171:58081)
Time: 2020/10/15 11:10:41 DEBUG: ClientConnectToPeerCommand: DJ:81278742EBB8C17114312EA2DAF02AEB9EC198EB|202.107.200.171:58081
Time: 2020/10/15 11:12:20 DEBUG: AsyncPeer.WaitConnection(202.107.200.171:58081)
Time: 2020/10/15 11:12:20 DEBUG: ClientWaitPeerConnectionCommand: 36.23.115.101|20064|DJ:81278742EBB8C17114312EA2DAF02AEB9EC198EB|User:81278742EBB8C17114312EA2DAF02AEB9EC198EB

UnhandledError.log

Time: 2020/10/15 11:06:56;
Type: System.NullReferenceException;
Message: 未将对象引用设置到对象的实例。;
StackTrace:
在 Engine.Network.AsyncPeer.Finder.Equals(NetConnection connection) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 500
在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 source, Func2 predicate)
在 Engine.Network.AsyncPeer.FindConnection(UserId id) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 485
在 Engine.Network.AsyncPeer.SendMessage(UserId peerId, IPackage package, Byte[] rawData, Boolean unreliable) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 312
在 Engine.Network.AsyncPeer.OnPeerConnected(NetIncomingMessage message) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 600
在 Engine.Network.AsyncPeer.OnReceive(Object obj) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncPeer.cs:行号 533
在 Engine.Helpers.EngineSyncContext.Event.Dispatch() 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Helpers\EngineSyncContext.cs:行号 38
在 Engine.Helpers.EngineSyncContext.ThreadFunc(Object state) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Helpers\EngineSyncContext.cs:行号 123
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
在 System.Threading.ThreadPoolWorkQueue.Dispatch()

Server

Server.log

Time: 2020/10/15 11:05:36 WARNING: Connection : not found;
StackTrace:
在 Engine.Network.AsyncServer.GetConnection(UserId connectionId, Boolean allowTempConnections) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncServer.cs:行号 500
在 Engine.Network.AsyncServer.SendMessage(UserId connectionId, IPackage package, Boolean allowTempConnections) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncServer.cs:行号 277
在 Engine.Network.AsyncServer.SendMessage(UserId connectionId, Int64 id, Boolean allowTempConnections) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\AsyncServer.cs:行号 250
在 Engine.Api.Server.Others.ServerPingRequestCommand.OnRun(CommandArgs args) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Api\Server\Others\ServerPingRequestCommand.cs:行号 21
在 Engine.Api.Server.ServerCommand.Run(CommandArgs args) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Api\Server\ServerCommand.cs:行号 30
在 Engine.Network.RequestQueue.QueueContainer.Process(Object o) 位置 D:\Users\WXF\Source\Repos\TCPChat\Engine\Network\RequestQueue.cs:行号 79
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
在 System.Threading.ThreadPoolWorkQueue.Dispatch()

Time: 2020/10/15 11:05:39 INFO: User login: User:81278742EBB8C17114312EA2DAF02AEB9EC198EB
Time: 2020/10/15 11:06:48 INFO: User login: Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB
Time: 2020/10/15 11:07:46 INFO: User login: Wangxf:81278742EBB8C17114312EA2DAF02AEB9EC198EB
Time: 2020/10/15 11:10:13 INFO: User login: DJ:81278742EBB8C17114312EA2DAF02AEB9EC198EB

Originally posted by @Witchie in https://github.com/Nirklav/TCPChat/issue_comments/708874577

настройка сервера

Добрый день, не подскажите, как вы настроили сервер ? я запускаю consoleserver на своем вдс "ConsoleServer.exe admin 2913 2913 false" , потом в самом чате прописываю адрес вдски и порт 2913 , но получаю Attempt to connect to server... Можете немного по подробнее по настройки сервера ?

Localization.fr-FR.xml

Hi, I add there my contribution for your project.

<?xml version="1.0" encoding="utf-8" ?>
<Localization>
  <row key="accept" value="Accepter"/>
  <row key="cancel" value="Annuler"/>
  <row key="ok" value="Ok"/>
  <row key="delete" value="Supprimer"/>
  <row key="nick" value="Pseudonyme"/>
  <row key="nickColor" value="Paramètres couleurs"/>
  <row key="port" value="Port"/>
  <row key="protocol" value="Protocol"/>

  <row key="systemMessage-ApiNotSupported" value="L'API n'est pas supporté par le serveur."/>
  <row key="systemMessage-ConnectionRetryAttempt" value="Tentative de connexion au serveur..."/>
  <row key="systemMessage-NotRegisteredBadName" value="La connexion ne peut aboutir avec ce pseudonyme."/>
  <row key="systemMessage-NotRegisteredNameAlreadyExist" value="La connexion ne peut aboutir avec ce pseudonyme (Déjà utilisé)."/>
  <row key="systemMessage-RoomAdminChanged" value="Vous êtes maintenant administrateur de la salle {0}."/>
  <row key="systemMessage-RoomAccessDenied" value="Accès refusé pour cette action."/>
  <row key="systemMessage-RoomAlreadyExist" value="Une salle porte déjà ce nom. Choisissez-en un autre."/>
  <row key="systemMessage-RoomCantLeaveMainRoom" value="Vus ne pouvez quitter la salle principale."/>
  <row key="systemMessage-RoomItsMainRoom" value="Cette action n'est pas possible dans la salle principale."/>
  <row key="systemMessage-RoomNotExist" value="La salle de ce nom n'existe pas."/>
  <row key="systemMessage-FileRemoveAccessDenied" value="Vous ne pouvez pas supprimer ce fichier. Accès refusé."/>
  <row key="systemMessage-FileRemoved" value="Le fichier {0} a été supprimé."/>
  <row key="systemMessage-MessageEditAccessDenied" value="Vous ne pouvez pas éditer ce message."/>
  <row key="systemMessage-P2PUserNotExist" value="Aucun utilisateur de ce nom n'a été trouvé."/>
  <row key="systemMessage-RoomUserNotExist" value="Aucun utilisateur de ce nom n'est présent dans la salle."/>
  <row key="systemMessage-InvalidPassword" value="Un mauvais mot de passe a été reçu."/>
  <row key="systemMessage-TextCommandNotFound" value="Commande introuvable."/>
  <row key="systemMessage-TextCommandsList" value="Liste des commandes du serveur :{0}"/>
  <row key="systemMessage-TextCommandInvalidParams" value="La commande comporte une erreur sur l'un des arguments."/>

  <row key="commonMessageTemplate-contextMenu-edit" value="Editer"/>
  <row key="commonMessageTemplate-contextMenu-copy" value="Copier"/>
  <row key="userTemplate-SetRoomAdmin" value="Assigner en tant qu'administrateur."/>
  <row key="menu-header-connect" value="Connexion"/>
  <row key="menu-connect" value="Connecter"/>
  <row key="menu-disconnect" value="Déconnecter"/>
  <row key="menu-enableServer" value="Activer le server"/>
  <row key="menu-disableServer" value="Désactiver le server"/>
  <row key="menu-exit" value="Quitter"/>

  <row key="menu-header-rooms" value="Salles"/>
  <row key="menu-createRoom" value="Créer"/>
  <row key="menu-closeRoom" value="Fermer"/>
  <row key="menu-inviteInRoom" value="Inviter"/>
  <row key="menu-kickFromRoom" value="Exclure"/>
  <row key="menu-enableVoiceInRoom" value="Voix activée"/>
  <row key="menu-disableVoiceInRoom" value="Voix désactivée"/>
  <row key="menu-exitFromRoom" value="Quitter"/>

  <row key="menu-header-File" value="Fichiers"/>
  <row key="menu-distributedFiles" value="Fichers envoyés"/>
  <row key="menu-addFileToRoom" value="Ajouter un fichier à la salle"/>

  <row key="menu-header-plugins" value="Plugins"/>

  <row key="menu-header-other" value="Autres"/>
  <row key="menu-notifications" value="Notifications"/>
  <row key="menu-settings" value="Paramètres"/>
  <row key="menu-about" value="A propos..."/>

  <row key="main-reciver" value="Destinataire"/>

  <row key="serverTemplate-p2pPort" value="Port P2P"/>
  <row key="serverTemplate-p2pPort-default" value="Default"/>

  <row key="audioTemplate-microphone" value="Microphone"/>
  <row key="audioTemplate-audioQuality" value="Qualité audio"/>
  <row key="audioTemplate-microphoneActivation" value="Activation du microphone"/>
  <row key="audioTemplate-speakers" value="Sortie audio"/>

  <row key="clientTemplate-Language" value="Langue"/>

  <row key="pluginsTemplate-nameHeader" value="Nom"/>
  <row key="pluginsTemplate-enabledHeader" value="Activé"/>
  <row key="pluginsTemplate-typeHeader" value="Type"/>
  <row key="pluginsTemplate-unloadPlugin" value="Décharger"/>
  <row key="pluginsTemplate-loadPlugin" value="Charger"/>

  <row key="settings-title" value="Paramètres"/>
  <row key="settings-Categories" value="Cathégories"/>
  <row key="settings-done" value="Terminé"/>

  <row key="settingsTabCategory-client" value="Client"/>
  <row key="settingsTabCategory-server" value="Serveur"/>
  <row key="settingsTabCategory-audio" value="Audio"/>
  <row key="settingsTabCategory-plugins" value="Plugins"/>

  <row key="settingsTab-audio-pressTheKey" value="Cliquer sur le bouton"/>
  <row key="settingsTab-client-adminPassword" value="Mot de passe administrateur"/>

  <row key="aboutProgram-title" value="A propos..."/>
  <row key="aboutProgram-author" value="Auteur"/>
  <row key="aboutProgram-feedback" value="Feedback"/>

  <row key="connectDialog-title" value="Connexion"/>
  <row key="connectDialog-ipAddress" value="Adresse IP"/>

  <row key="createRoomDialog-title" value="Créer une salle"/>
  <row key="createRoomDialog-roomName" value="Nom"/>
  <row key="createRoomDialog-audioRoom" value="Salle audio"/>

  <row key="postedFilesDialog-title" value="Fichiers envoyés"/>

  <row key="mainViewModel-paramsError" value="Erreur dans les données entrées."/>
  <row key="mainViewModel-clientNotCreated" value="Le client n'est connecté à aucun serveur. Commencez par vous connecter."/>
  <row key="mainViewModel-apiNotSupported" value="L'application ne peut supporter cette version d'API ({0}). Connexion refus"e."/>
  <row key="mainViewModel-roomExitQuestion" value="Voulez-vous quitter cette salle ?"/>
  <row key="mainViewModel-roomCloseQuestion" value="Voulez-vous fermer cette salle ?"/>
  <row key="mainViewModel-serverDisableQuestion" value="Voulez-vous désactiver le serveur ?"/>
  <row key="mainViewModel-fileMustDontExist" value="Vous devez sélectionnez un nom de fichier inexistant."/>
  <row key="mainViewModel-allInRoom" value="Tous dans la salle"/>
  <row key="mainViewModel-audioInitializationFailed" value="Le système audio n'est initialisé. Chat vocale désactivé."/>

  <row key="messageViewModel-from" value="[{0}] depuis : "/>
  <row key="messageViewModel-pmForm" value="[{0}] PM depuis : "/>
  <row key="messageViewModel-byteStr" value="octets"/>
  <row key="messageViewModel-kbyteStr" value="Ko"/>
  <row key="messageViewModel-mbyteStr" value="Mo"/>
  <row key="messageViewModel-fileNotFound" value="Fichier non valide"/>
  <row key="messageViewModel-cantDownloadItsFile" value="Vous ne devez pas télécharger vos propres fichiers."/>
  <row key="messageViewModel-cancelDownloadingQuestion" value="Vous avez déjà télécharger ce fichier. Annuler ?"/>
  <row key="messageViewModel-fileDownloaded" value="Fichier {0} téléchargé."/>
  <row key="messageViewModel-fileRemoved" value="Fichier supprimé du serveur."/>

  <row key="roomViewModel-inviteInRoomTitle" value="Inviter en salle"/>
  <row key="roomViewModel-kickFormRoomTitle" value="Exclure de la salle"/>
  <row key="roomViewModel-nobodyToInvite" value="Personne à inviter. Tout le monde est déjà dans cette salle."/>
  <row key="roomViewModel-allInRoom" value="Tous dans la salle"/>
  <row key="userViewModel-userNotExist" value="Utilisation inexistant"/>

  <row key="errorCode-ApiNotSupported" value="L'API du Serveur n'est pas supporté par le client. Il sera probablement nécessaire d'effectuer une MAJ du client ou du serveur."/>
  <row key="errorCode-FileAlreadyDownloading" value="Ce fichier est déjà en téléchargement."/>
  <row key="errorCode-FreePortDontFound" value="Port TCP/UDP libre introuvable"/>
  <row key="errorCode-LargeReceivedData" value="Received data to large."/>
  <row key="errorCode-CantDownloadOwnFile" value="Impossible de télécharger ce fichier"/>
  <row key="errorCode-AudioNotEnabled" value="Audio désactivé"/>
  <row key="errorCode-PluginError" value="Des erreurs d'extension se sont produites."/>
  <row key="errorCode-RoomNotFound" value="Salle introuvable"/>
  <row key="errorCode-FileInRoomNotFound" value="Fichier en salle introuvable"/>
  <row key="errorCode-WrongContentType" value="Mauvais type de contenu (erreur interne)."/>
  <row key="errorCode-IllegalInvoker" value="Invocateur illégal (erreur interne)"/>
  <row key="errorCode-UnknownRoomType" value="Type de salle inconnue"/>
</Localization>

Поддержка IPv6

Исправить поддержку IPv6 для прямого соединения между клиентами.

Развитие чата

Привет. Интересует дальнейшая судьба этого чата.

Например:

  1. Эмотиконы
  2. Аватары
  3. Статус (онлайн, оффлайн, отошёл, занят, т.п.)
  4. Подпись под ником как во всяких skype'ах
  5. "User is typing a message" когда набираешь сообщение
  6. Отслеживание сообщений только с определённой комнаты(чтобы не спамило со всех)
  7. Больше команд для админа сервера и владельцев комнат: выгнать с сервера, замутить, резервные слоты
  8. Создание групп в комнатах(аналогия с TeamSpeak)
  9. Какая-то информация о сервере, комнате, группе как в TeamSpeak
  10. Если уж говорить о TeamSpeak то почему бы не реализовать схожую систему с использованием public, private key что позволит серверу идентифицировать пользователей и выдавать им их текущие комнаты, группы, etc

Ну и можно всякого добавить. Хотел в общих чертах обрисовать смысл.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.