{"id":16207639,"url":"https://github.com/cemuka/telegraph","last_synced_at":"2025-03-19T08:30:27.873Z","repository":{"id":118943299,"uuid":"354662489","full_name":"cemuka/Telegraph","owner":"cemuka","description":"Message driven, TCP networking in Unity, built on Telepathy and MessagePack.","archived":false,"fork":false,"pushed_at":"2021-04-05T21:40:42.000Z","size":2140,"stargazers_count":9,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-17T04:51:35.997Z","etag":null,"topics":["client","message-pack","network","server","tcp","telepathy","unity"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cemuka.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-04T22:52:48.000Z","updated_at":"2025-03-02T11:33:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"76a5c43a-f6bc-4688-8b36-58c6384e5420","html_url":"https://github.com/cemuka/Telegraph","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FTelegraph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FTelegraph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FTelegraph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cemuka%2FTelegraph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cemuka","download_url":"https://codeload.github.com/cemuka/Telegraph/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244389611,"owners_count":20444967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client","message-pack","network","server","tcp","telepathy","unity"],"created_at":"2024-10-10T10:14:05.858Z","updated_at":"2025-03-19T08:30:27.866Z","avatar_url":"https://github.com/cemuka.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"Telegraph is built on [Telepathy](https://github.com/vis2k/Telepathy) and [MessagePack](https://github.com/neuecc/MessagePack-CSharp).\n\nI also made a custom command console, inspired by Quantum Console from unity asset store.\n\nProject contains a chat sample for server and client.\n\n`ServerApplicationStartup.cs`\n\n```csharp\nusing System;\nusing UnityEngine;\nusing CommandConsole;\n\npublic class ServerApplicationStartup : MonoBehaviour\n{\n    private Server _server;\n    private MessageHandler _handler;\n    private CommandConsole.Console _console;\n\n    private void Start()\n    {\n        Application.targetFrameRate = 60;\n\n        _server = new Server();\n        _server.Start(7777);\n\n        _server.ClientConnectedEvent    += OnClientConnect;\n        _server.MessageReceivedEvent    += OnMessage;\n        _server.ClientDisconnectedEvent += OnClientDisconnect;\n\n        _handler = new MessageHandler();\n        _handler.AddHandler(\"chat\", HandleChatMessage);\n\n        _console = new CommandConsole.Console();\n        _console.Initialize();\n        _console.Register(\"greet_all\", ClientGreeter);\n    }\n\n    private void ListenConsoleInput()\n    {\n        if (Input.GetKey(KeyCode.LeftShift) \u0026\u0026 Input.GetKeyDown(KeyCode.Tab))\n        {\n            _console.Show();\n        }\n\n        if (Input.GetKeyDown(KeyCode.Escape))\n        {\n            _console.Hide();\n        }\n    }\n\n    //  event callbacks\n    private void OnClientConnect(int connId)\n    {\n        var greet = new GreetPacket()\n        {\n            id = connId,\n            greetMessage = \"Server connection success. Welcome to chat.\"\n        };\n\n        var msg = new Message()\n        {\n            header = \"greet\",\n            packet   = greet.Serialize()\n        };\n\n        _server.Send(connId, msg.Serialize());\n    }\n\n    private void OnMessage(int connId, ArraySegment\u003cbyte\u003e data)\n    {\n        _handler.Handle(data);\n    }\n\n    private void OnClientDisconnect(int connId)\n    {\n        Debug.Log(\"Client connection lost. connId: \" + connId);\n    }\n\n    private void OnApplicationQuit()\n    {\n        _server.Stop();\n    }\n\n    //  handlers\n    private void HandleChatMessage(ArraySegment\u003cbyte\u003e data)\n    {\n        var chat = data.Deserialize\u003cChatPacket\u003e();\n\n        Debug.Log(\"received chat, author: \" + chat.author);\n\n        var msg = new Message()\n        {\n            header = \"chat\",\n            packet = data\n        };\n        \n        _server.SendAll(msg.Serialize());\n    }\n\n    //  tick server\n    private void Update()\n    {\n        ListenConsoleInput();\n        _server.Tick(100);\n    }\n\n    //  console commands\n    private void ClientGreeter(string[] args)\n    {\n        var greet = new GreetPacket()\n        {\n            id = -1,\n            greetMessage = \"Server watch you. Take care.\"\n        };\n\n        var msg = new Message()\n        {\n            header = \"greet\",\n            packet = greet.Serialize()\n        };\n\n        _server.SendAll(msg.Serialize());\n    }\n}\n```\n`ClientApplicationStartup.cs`\n\n```csharp\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class ClientApplicationStartup : MonoBehaviour\n{\n    public string ip = \"127.0.0.1\";\n    public int port = 7777;\n    public Transform canvasParent;\n    public GameObject loginPrefab;\n    public GameObject chatPrefab;\n\n    private string _clientNickname;\n    private ChatPanel _chatPanel;\n\n    private Client _client;\n    private MessageHandler _handler;\n\n    private void Start()\n    {\n        Application.targetFrameRate = 60;\n\n        var login = Instantiate(loginPrefab, canvasParent).GetComponent\u003cLoginPanel\u003e();\n        login.inputField.onEndEdit.AddListener(input =\u003e _clientNickname = input );\n        login.connectButton.onClick.AddListener(() =\u003e Connect());\n    }\n\n    private void CreateChatPanel()\n    {\n        _chatPanel = Instantiate(chatPrefab, canvasParent).GetComponent\u003cChatPanel\u003e();\n        _chatPanel.chatLogText.text = \"\";\n        _chatPanel.inputField.onEndEdit.AddListener(OnChatInput);\n        _chatPanel.inputField.ActivateInputField();\n    }\n    \n    private void Connect()\n    {\n        CreateChatPanel();\n\n        _client = new Client();\n        _client.Start(ip, port);\n        _client.OnMessageReceived   += MessageReceived;\n        \n        _handler = new MessageHandler();\n        _handler.AddHandler(\"chat\",     HandleChatMessage);\n        _handler.AddHandler(\"greet\",    GreetHandleMessage);\n\n    }\n\n    //  event callbacks\n    private void MessageReceived(ArraySegment\u003cbyte\u003e msg)\n    {\n        _handler.Handle(msg);\n    }\n\n    private void OnChatInput(string input)\n    {\n        if (!string.IsNullOrEmpty(input) \u0026\u0026 !string.IsNullOrWhiteSpace(input))\n        {\n            var chat = new ChatPacket()\n            {\n                author = _clientNickname,\n                entry  = input\n            };\n\n            var msg = new Message()\n            {\n                header = \"chat\",\n                packet   = chat.Serialize()\n            };\n\n            _client.Send(msg.Serialize());\n\n            _chatPanel.inputField.text = \"\";\n            _chatPanel.inputField.ActivateInputField();\n        }\n    }\n\n    private void OnApplicationQuit()\n    {\n        _client.Disconnect();\n    }\n\n    //  handlers\n    private void HandleChatMessage(ArraySegment\u003cbyte\u003e chatData)\n    {\n        var chat = chatData.Deserialize\u003cChatPacket\u003e();\n\n        //  log to view\n        _chatPanel.AddLog(chat.author + \": \" + chat.entry);\n    }\n\n    private void GreetHandleMessage(ArraySegment\u003cbyte\u003e chatData)\n    {\n        var greet = chatData.Deserialize\u003cGreetPacket\u003e();\n\n        _chatPanel.AddLog(greet.greetMessage);\n        _chatPanel.AddLog(\"Connection id: \" + greet.id);\n    }\n\n    //  tick client\n    private void Update()\n    {\n        _client.Tick(100);\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemuka%2Ftelegraph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcemuka%2Ftelegraph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcemuka%2Ftelegraph/lists"}