{"id":17280178,"url":"https://github.com/akuli/mantaray","last_synced_at":"2025-10-04T19:09:51.718Z","repository":{"id":43377431,"uuid":"61315861","full_name":"Akuli/mantaray","owner":"Akuli","description":"An IRC client written in Python with Tkinter.","archived":false,"fork":false,"pushed_at":"2024-03-02T23:39:17.000Z","size":1154,"stargazers_count":11,"open_issues_count":23,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-27T23:01:43.341Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","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/Akuli.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,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2016-06-16T18:16:37.000Z","updated_at":"2024-05-30T19:57:48.000Z","dependencies_parsed_at":"2024-03-01T21:48:23.747Z","dependency_job_id":null,"html_url":"https://github.com/Akuli/mantaray","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/Akuli%2Fmantaray","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Akuli%2Fmantaray/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Akuli%2Fmantaray/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Akuli%2Fmantaray/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Akuli","download_url":"https://codeload.github.com/Akuli/mantaray/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248855703,"owners_count":21172629,"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":[],"created_at":"2024-10-15T09:19:38.817Z","updated_at":"2025-10-04T19:09:46.659Z","avatar_url":"https://github.com/Akuli.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mantaray\n\nThis is an IRC client written in Python with tkinter and ttk.\n\n![Screenshot](screenshot.png)\n\nSupported features:\n\n- SSL\n- SASL authentication\n- Notifications for new messages\n- Multiple channels\n- Multiple servers\n- Private messages\n- `/away` \u0026 `/back`\n- `/me`\n- `/kick`\n\nYou can run Mantaray like this, assuming you have Python 3.8 or newer:\n\n    $ sudo apt install libnotify-bin   # skip this on MacOS\n    $ git clone https://github.com/Akuli/mantaray\n    $ cd mantaray\n    $ python3 -m venv env\n    $ source env/bin/activate\n    $ pip install -r requirements.txt\n    $ python3 -m mantaray\n\nOn Windows, run these commands in Command Prompt:\n\n    $ git clone https://github.com/Akuli/mantaray\n    $ cd mantaray\n    $ py -m venv env\n    $ env\\Scripts\\activate\n    $ pip install -r requirements.txt\n    $ py -m mantaray\n\n\n## Developing\n\nFirst, run mantaray as shown above.\nBy default, it connects to `##learnpython` on libera, which is where\nmost of the discussion about Mantaray development happens.\nI am there almost every day at about 6PM to 10PM UTC.\n\nTo install tools needed for development, run:\n\n    $ source env/bin/activate\n    $ pip install -r requirements-dev.txt\n\nMantaray's tests use IRC servers that Mantaray connects to for testing.\nThey are included with Mantaray as Git submodules.\nTo run tests, you need to download the servers and then actually run the tests:\n\n    $ git submodule init\n    $ git submodule update\n    $ python3 -m pytest\n\nBy default, the tests use [Mantatail](https://github.com/ThePhilgrim/MantaTail)\nas their IRC server.\nYou can change it by setting the `IRC_SERVER` environment variable.\nFor example, the following command runs the tests with `hircd` as the IRC server:\n\n    $ IRC_SERVER=hircd python3 -m pytest\n\nIf you add new tests and they fail because the IRC servers are too old,\nyou can update them by running `git pull` inside the submodule. For example:\n\n    $ cd tests/MantaTail\n    $ git pull origin main\n    $ cd ..\n    $ git add MantaTail\n    $ git commit -m \"update mantatail\"\n\nTo experiment with new features locally, you can start [Mantatail](https://github.com/ThePhilgrim/MantaTail) manually:\n\n    $ cd tests/MantaTail\n    $ python3 server.py\n\nThen in another terminal, run Mantaray.\nIt comes with the correct configuration for connecting to Mantatail.\nIn fact, there's two, in folders `alice` and `bob`,\nbecause it's often handy to simultaneously run two instances of Mantaray\nconnected to each other.\n\n    $ python3 -m mantaray --alice\n\nThis should connect Mantaray to Mantatail.\nYou can connect other IRC clients too,\nor you can connect another instance of Mantaray with `--bob` instead of `--alice`.\nThis is essentially what Mantaray's tests do.\n\nI recommend downloading two copies of Mantaray:\none that you develop, and another that you use to talk with people.\nYou probably want to have different settings on the two copies.\nFor example, the development copy could have a different nickname,\nand join a channel where nobody will get annoyed if you constantly join and leave.\nTo do this, you can create a new folder for the development settings\nand tell Mantaray to use it with `--config-dir`:\n\n    $ mkdir dev-config\n    $ python3 -m mantaray --config-dir dev-config\n\nRun `python3 -m mantaray --help` to see\nwhere it stores the configuration by default.\n\n\n## How Mantaray works\n\nWhen mantaray starts:\n\n1. User runs `python3 -m mantaray`. This runs `__main__.py`.\n    It is as if the user ran `python3 mantaray/__main__.py`, except that imports work the right way:\n    `from mantaray import foo` imports `mantaray/foo.py`.\n2. `__main__.py` parses command-line arguments, such as `--config-dir`.\n3. `__main__.py` calls `config.py` to load the configuration\n    or display a connecting dialog if `config.json` doesn't exist yet.\n4. `__main__.py` initializes the GUI (`gui.py`).\n    Each `ServerView` (from `views.py`) creates its own connection to the server (`IrcCore` in backend.py).\n\nHere's how the different files interact with each other once mantaray is started:\n\n![mantaray-running.png](mantaray-running.png)\n\n\n## How IRC works\n\nMantaray connects a TCP socket, optionally with SSL, to a server.\nYou don't really need to know what TCP and SSL are.\nThe important thing is that this way Mantaray can send bytes to the server\nand receive bytes from the server.\nTo see what exactly Mantaray sends and receives, run it with `--verbose`.\nFor example:\n\n    $ python3 -m mantaray --config-dir dev-config --verbose\n\nFor quick experimenting, it's often useful to connect to IRC without Mantaray.\nIf you are on Linux or Mac, you can use netcat (aka `nc`) for this:\n\n    $ nc irc.libera.chat 6667\n\nOn windows, it is possible to download netcat,\nbut I find telnet to be easier to install\n(google e.g. \"windows 7 install telnet\"):\n\n    $ telnet irc.libera.chat 6667\n\nHere `irc.libera.chat` and `6667` are the host and port,\ni.e. the same information you would enter to Mantaray's connect dialog.\nIf you want to connect to Mantatail, use `localhost` instead of `irc.libera.chat`.\nNetcat and telnet don't support SSL, so we use port 6667 instead of 6697.\n\nYou should get something like this:\n\n    :sodium.libera.chat NOTICE * :*** Checking Ident\n    :sodium.libera.chat NOTICE * :*** Looking up your hostname...\n    :sodium.libera.chat NOTICE * :*** Found your hostname: foobar.example.com\n    :sodium.libera.chat NOTICE * :*** No Ident response\n\nYou can then type this to netcat (or telnet),\nreplacing `nickname`, `username` and `realname` with whatever you want:\n\n    NICK nickname\n    USER username 0 * :realname\n\nYou can then join channels (`JOIN ##learnpython`),\nsend messages to channels (`PRIVMSG ##learnpython :hello world`) and so on.\n\nI recommend [modern.ircdocs.horse](https://modern.ircdocs.horse/)\nif you want more details about how each IRC command works.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakuli%2Fmantaray","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakuli%2Fmantaray","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakuli%2Fmantaray/lists"}