{"id":48289089,"url":"https://github.com/mfreeman451/exirc-next","last_synced_at":"2026-04-04T23:00:55.364Z","repository":{"id":342482599,"uuid":"1174076986","full_name":"mfreeman451/exirc-next","owner":"mfreeman451","description":"IRC client adapter for Elixir projects","archived":false,"fork":false,"pushed_at":"2026-03-09T06:12:17.000Z","size":331,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-10T12:47:49.812Z","etag":null,"topics":["elixir","irc","irc-library"],"latest_commit_sha":null,"homepage":"","language":"Elixir","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/mfreeman451.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-06T03:32:19.000Z","updated_at":"2026-03-09T06:12:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mfreeman451/exirc-next","commit_stats":null,"previous_names":["mfreeman451/exirc-next","mfreeman451/exirc"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mfreeman451/exirc-next","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfreeman451%2Fexirc-next","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfreeman451%2Fexirc-next/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfreeman451%2Fexirc-next/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfreeman451%2Fexirc-next/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mfreeman451","download_url":"https://codeload.github.com/mfreeman451/exirc-next/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mfreeman451%2Fexirc-next/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31418286,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["elixir","irc","irc-library"],"created_at":"2026-04-04T23:00:47.726Z","updated_at":"2026-04-04T23:00:55.266Z","avatar_url":"https://github.com/mfreeman451.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ExIRC Next\n\n[![CI](https://github.com/mfreeman451/exirc/workflows/CI/badge.svg)](https://github.com/mfreeman451/exirc/actions)\n[![Hex.pm Version](http://img.shields.io/hexpm/v/exirc_next.svg?style=flat)](https://hex.pm/packages/exirc_next)\n\nA modern IRC client library for Elixir projects. Actively maintained fork of [bitwalker/exirc](https://github.com/bitwalker/exirc).\n\nIt aims to have a clear, well-documented API, with the minimal amount of code necessary to allow you to connect and communicate with IRC servers effectively. It implements the full RFC2812 protocol, and relevant parts of RFC1459.\n\n## Requirements\n\n- Elixir ~\u003e 1.17\n- OTP 27+\n\n## Getting Started\n\nAdd ExIRC Next as a dependency to your project in `mix.exs`:\n\n```elixir\ndefp deps do\n  [{:exirc_next, \"~\u003e 3.0\"}]\nend\n```\n\nThen fetch it using `mix deps.get`.\n\nTo use ExIRC, you need to start a new client process and add event handlers. An example event handler module is located in `lib/exirc/example_handler.ex`. **The example handler is kept up to date with all events you can expect to receive from the client**.\n\nThere is also a variety of examples in `examples/`, the most up to date of which is `examples/bot`.\n\n```elixir\ndefmodule MyBot do\n  use GenServer\n\n  defmodule State do\n    defstruct host: \"irc.choopa.net\",\n              port: 6667,\n              pass: \"\",\n              nick: \"mybot\",\n              user: \"mybot\",\n              name: \"My Bot\",\n              client: nil,\n              handlers: []\n  end\n\n  def start_link(_) do\n    GenServer.start_link(__MODULE__, %State{})\n  end\n\n  def init(state) do\n    # Start the client and handler processes\n    {:ok, client} = ExIRC.start_link!()\n    {:ok, handler} = ExampleHandler.start_link(nil)\n\n    # Register the event handler with ExIRC\n    ExIRC.Client.add_handler(client, handler)\n\n    # Connect and logon to a server, join a channel and send a simple message\n    ExIRC.Client.connect!(client, state.host, state.port)\n    ExIRC.Client.logon(client, state.pass, state.nick, state.user, state.name)\n    ExIRC.Client.join(client, \"#elixir-lang\")\n    ExIRC.Client.msg(client, :privmsg, \"#elixir-lang\", \"Hello world!\")\n\n    {:ok, %{state | client: client, handlers: [handler]}}\n  end\n\n  def terminate(_, state) do\n    ExIRC.Client.quit(state.client, \"Goodbye, cruel world.\")\n    ExIRC.Client.stop!(state.client)\n    :ok\n  end\nend\n```\n\nA more robust example waits until connected before attempting to logon, and waits until logged on before joining channels. See the `examples` directory for more in-depth cases.\n\n```elixir\ndefmodule ExampleApplication do\n  use Application\n\n  @impl true\n  def start(_type, _args) do\n    {:ok, client} = ExIRC.start_link!()\n\n    children = [\n      {ExampleConnectionHandler, client},\n      {ExampleLoginHandler, [client, [\"#mybot-testing\"]]}\n    ]\n\n    opts = [strategy: :one_for_one, name: ExampleApplication.Supervisor]\n    Supervisor.start_link(children, opts)\n  end\nend\n\ndefmodule ExampleConnectionHandler do\n  use GenServer\n\n  defmodule State do\n    defstruct host: \"irc.choopa.net\",\n              port: 6667,\n              pass: \"\",\n              nick: \"mybot\",\n              user: \"mybot\",\n              name: \"My Bot\",\n              client: nil\n  end\n\n  def start_link(client, state \\\\ %State{}) do\n    GenServer.start_link(__MODULE__, [%{state | client: client}])\n  end\n\n  def init([state]) do\n    ExIRC.Client.add_handler(state.client, self())\n    ExIRC.Client.connect!(state.client, state.host, state.port)\n    {:ok, state}\n  end\n\n  def handle_info({:connected, server, port}, state) do\n    IO.puts(\"Connected to #{server}:#{port}\")\n    ExIRC.Client.logon(state.client, state.pass, state.nick, state.user, state.name)\n    {:noreply, state}\n  end\n\n  def handle_info(_msg, state) do\n    {:noreply, state}\n  end\nend\n\ndefmodule ExampleLoginHandler do\n  @moduledoc \"\"\"\n  Listens for login events and then joins the appropriate channels.\n  \"\"\"\n  use GenServer\n\n  def start_link(client, channels) do\n    GenServer.start_link(__MODULE__, [client, channels])\n  end\n\n  def init([client, channels]) do\n    ExIRC.Client.add_handler(client, self())\n    {:ok, {client, channels}}\n  end\n\n  def handle_info(:logged_in, {client, channels} = state) do\n    IO.puts(\"Logged in to server\")\n    Enum.each(channels, \u0026ExIRC.Client.join(client, \u00261))\n    {:noreply, state}\n  end\n\n  def handle_info(_msg, state) do\n    {:noreply, state}\n  end\nend\n```\n\n## History\n\nThis project is a fork of [bitwalker/exirc](https://github.com/bitwalker/exirc), which is no longer actively maintained. ExIRC Next modernizes the codebase for current Elixir/OTP versions and adds contemporary tooling (Credo, Dialyxir, mix_audit, sobelow).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmfreeman451%2Fexirc-next","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmfreeman451%2Fexirc-next","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmfreeman451%2Fexirc-next/lists"}