{"id":20218729,"url":"https://github.com/natan-dot-com/internet-relay-chat","last_synced_at":"2025-08-12T18:45:33.063Z","repository":{"id":48124112,"uuid":"501051638","full_name":"natan-dot-com/Internet-Relay-Chat","owner":"natan-dot-com","description":"Simple internet relay chat implementation made with learning purposes","archived":false,"fork":false,"pushed_at":"2022-07-22T03:25:34.000Z","size":81,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-13T22:33:55.455Z","etag":null,"topics":["chat","icmc","irc","networks","protocol","usp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/natan-dot-com.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-08T00:56:26.000Z","updated_at":"2022-06-08T01:26:12.000Z","dependencies_parsed_at":"2022-08-12T19:01:21.961Z","dependency_job_id":null,"html_url":"https://github.com/natan-dot-com/Internet-Relay-Chat","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/natan-dot-com%2FInternet-Relay-Chat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natan-dot-com%2FInternet-Relay-Chat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natan-dot-com%2FInternet-Relay-Chat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natan-dot-com%2FInternet-Relay-Chat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/natan-dot-com","download_url":"https://codeload.github.com/natan-dot-com/Internet-Relay-Chat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241661104,"owners_count":19998946,"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":["chat","icmc","irc","networks","protocol","usp"],"created_at":"2024-11-14T06:39:36.228Z","updated_at":"2025-03-03T11:41:53.797Z","avatar_url":"https://github.com/natan-dot-com.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Redes de Computadores - Internet Relay Chat\n\n\u003e Este trabalho pode ser acessado pelo [Github](https://github.com/natan-dot-com/Internet-Relay-Chat), [vídeo](https://youtu.be/FRpHRayL3GY).\n\n### Autores\n\n- Natan Henrique Sanches (11795680)\n- Gabriel da Cunha Dertoni (11795717)\n- Álvaro José Lopes (10873365)\n\n## Introdução\n\nNeste projeto, foi implementado um modelo de IRC (Internet Relay Chat) simples, baseado na interação entre diversos clientes e um servidor. O projeto foi feito com caráter pedagógico para a disciplina de Redes de Computadores, utilizando linguagem C++ e bibliotecas como `sys/socket.h`, `arpa/inet.h` e `netinet/in.h` (para permitir a transmissão de mensagens cliente-servidor), além da biblioteca `ncurses.h` (para criação da interface do cliente).\n\n## Implementação\n\nO servidor pôde ser implementado em uma única _thread_, através da utilização do sistema de gerenciamento de eventos em um descritor de arquivos (`poll`). Além disso, o cliente foi implementado com duas _threads_, encarregadas de enviar mensagens (_sender_) e receber mensagens (_receiver_) do servidor. A _thread sender_ envia mensagens por demanda ao servidor central, enquanto a _thread receiver_ constantemente lê o _buffer_ de mensagens e, se houver alguma ainda não entregue, ela é exibida na tela.\n\n## Procedimentos de Execução\n\nO projeto foi testado nos sistemas operacionais Debian 11 '_Bullseye_' e Windows 11, além de ter sido compilado (em ambos os casos) com G++11.\n\n```bash\n# Compila tanto o servidor, quanto o cliente.\nmake\n\n# Roda o sevidor\n./build/server/main\n\n# Roda o client\n./build/client/main \u003cip_do_servidor\u003e 8080\n#                                    ^^^^~~~ porta para se conectar.\n```\n\n## Comandos\n\nNeste projeto, foram implementados os comandos do protocolo [RFC 1459](https://datatracker.ietf.org/doc/html/rfc1459). Os comandos requisitados no enunciado foram, portanto, codificados em função dos comandos do RFC 1459.\n\n#### Lista de Comandos\n\n|**Comando**|**Descrição**|**Permissão**|\n|-----------|-------------|-------------|\n|`/connect`|Estabelece a conexão com o servidor|Todos os usuários|\n|`/quit`|Encerra a conexão do cliente com o servidor|Todos os usuários|\n|`/ping`|Checa o estado da conexão com o servidor. Retorna `pong` se estiver conectado|Todos os usuários|\n|`/join \u003cNome Canal\u003e`|Entra (ou cria, se não existir) no canal `\u003cNomeCanal\u003e`|Todos os usuários|\n|`/nickname \u003cApelido\u003e`|Atribui um determinado apelido para o cliente autor|Todos os usuários|\n|`/user \u003cApelido\u003e \u003cNome Real\u003e`|Atribui informações a um cliente com determinado apelido|Todos os usuários|\n|`/kick \u003cApelido\u003e`|Expulsa um determinado usuário do servidor|Somente administrador|\n|`/mute \u003cApelido\u003e`|Proíbe um determinado usuário de mandar mensagens|Somente administrador|\n|`/unmute \u003cApelido\u003e`|Restaura a permissão de um determinado usuário de mandar mensagens|Somente administrador|\n|`/whois \u003cApelido\u003e`|Visualiza informações (incluindo o IP) de determinado usuário|Somente administrador|\n\nEm nossa implementação, o comando `connect` é executado automaticamente por parte do cliente. Além disso, o comando `nickname` é mandatório e deve ser o primeiro utilizado após estabelecimento da conexão. Seguido dele, deve ser utilizado o comando `user` para dar informações sobre o cliente que está se conectando. Após isso, o usuário terá acesso ao restante dos comandos.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatan-dot-com%2Finternet-relay-chat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnatan-dot-com%2Finternet-relay-chat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatan-dot-com%2Finternet-relay-chat/lists"}