{"id":42734529,"url":"https://github.com/ugjka/kittybot","last_synced_at":"2026-01-29T17:57:51.424Z","repository":{"id":57538520,"uuid":"287028643","full_name":"ugjka/kittybot","owner":"ugjka","description":"IRCv3 enabled bot for Kittens","archived":false,"fork":false,"pushed_at":"2025-11-22T06:45:31.000Z","size":187,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-22T08:27:36.092Z","etag":null,"topics":["bot","bot-framework","golang","irc","ircv3"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ugjka.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,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-08-12T14:00:34.000Z","updated_at":"2025-11-22T06:45:35.000Z","dependencies_parsed_at":"2023-12-03T08:26:42.856Z","dependency_job_id":"408999dc-174d-4bc7-aea6-74e381c8a6c0","html_url":"https://github.com/ugjka/kittybot","commit_stats":null,"previous_names":[],"tags_count":66,"template":false,"template_full_name":null,"purl":"pkg:github/ugjka/kittybot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ugjka%2Fkittybot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ugjka%2Fkittybot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ugjka%2Fkittybot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ugjka%2Fkittybot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ugjka","download_url":"https://codeload.github.com/ugjka/kittybot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ugjka%2Fkittybot/sbom","scorecard":{"id":907309,"data":{"date":"2025-08-11","repo":{"name":"github.com/ugjka/kittybot","commit":"7978982773a48875e918801ccdc1b90f6fa7b6b3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T17:48:17.691Z","repository_id":57538520,"created_at":"2025-08-24T17:48:17.692Z","updated_at":"2025-08-24T17:48:17.692Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28881987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T16:41:59.663Z","status":"ssl_error","status_checked_at":"2026-01-29T16:39:39.641Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["bot","bot-framework","golang","irc","ircv3"],"created_at":"2026-01-29T17:57:49.006Z","updated_at":"2026-01-29T17:57:51.418Z","avatar_url":"https://github.com/ugjka.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KittyBot\n\n[![GoDoc](https://godoc.org/github.com/ugjka/kittybot?status.png)](https://godoc.org/github.com/ugjka/kittybot)\n\nA hard fork of [github.com/whyrusleeping/hellabot](https://github.com/whyrusleeping/hellabot)\n\n![kittybot](kitty.png?raw=true)\n\nKitten approved Internet Relay Chat (IRC) bot. KittyBot is an easily hackable event-based IRC bot\nframework with the ability to be updated without losing connection to the\nserver. To respond to an event, simply create a \"Trigger\" struct containing\ntwo functions, one for the condition, and one for the action.\n\n## Warning\n\nWe are at v0.0.X, the API may change without warning!!!\n\n## Example Trigger\n\n```go\nvar myTrigger = kitty.Trigger{\n    Condition: func(bot *kitty.Bot, m *kitty.Message) bool {\n        return m.From == \"ugjka\"\n    },\n    Action: func(bot *kitty.Bot, m *kitty.Message) {\n        bot.Reply(m, \"ugjka said something\")\n    },\n}\n```\n\nThe trigger makes the bot announce to everyone that something was said in the current channel. Use the code snippet below to make the bot and add the trigger.\n\n```go\nbot, err := kitty.NewBot(\"irc.libera.chat:6697\",\"kittybot\")\nif err != nil {\n    panic(err)\n}\nbot.AddTrigger(MyTrigger)\nbot.Run() // Blocks until exit\n```\n\nThe 'To' field on the message object in triggers will refer to the channel that\na given message is in unless it is a server message or a user-to-user private message. In such cases, the field will be the target user's name.\n\nFor more example triggers, check the examples directory.\n\n## The Message struct\n\nThe message struct is primarily what you will be dealing with when building\ntriggers or reading from the Incoming channel.\nThis is mainly the ircmsg.Message struct with some additions.\nSee [https://github.com/ugjka/ircmsg/blob/master/message.go#L221](https://github.com/ugjka/ircmsg/blob/master/message.go#L221)\n\n```go\n // Message represents a message received from the server\n type Message struct {\n     // ircmsg.Message with extended data, like GetTag() for IRCv3 tags\n     *ircmsg.Message\n\n     // Content generally refers to the text of a PRIVMSG\n     Content string\n\n     // Raw contains the raw message\n     Raw string\n\n     //Time at which this message was recieved\n     TimeStamp time.Time\n\n     // Entity that this message was addressed to (channel or user)\n     To string\n\n     // Nick of the messages sender (equivalent to Prefix.Name)\n     // Outdated, please use .Name\n     From string\n }\n```\n\n## Connection Passing\n\nKittyBot can restart without dropping its connection to the server\n(on Linux machines, and BSD flavors) by passing the TCP connection through a UNIX domain socket.\nThis allows you to update triggers and other addons without actually logging\nyour bot out of the IRC, avoiding the loss of op status and spamming the channel\nwith constant join/part messages. To do this, run the program again with\nthe same nick and without killing the first program (different nicks won't reuse the same bot instance). The first program will shut down, and the new one\nwill take over.\n\n\\***\\*This does not work with SSL connections, because we can't hand over a SSL connections state.\\*\\***\n\n## Security\n\nKittyBot supports both SSL and SASL for secure connections to whichever server\nyou like. To enable SSL, pass the following option to the NewBot function.\n\n```go\nsslOptions := func(bot *kitty.Bot) {\n    bot.SSL = true\n}\n\nbot, err := kitty.NewBot(\"irc.libera.chat:6697\",\"kittybot\",sslOptions)\n// Handle err as you like\n\nbot.Run() # Blocks until disconnect.\n```\n\nTo use SASL to authenticate with the server:\n\n```go\nsaslOption = func(bot *kitty.Bot) {\n    bot.SASL = true\n    bot.Password = \"somepassword\"\n}\n\nbot, err := kitty.NewBot(\"irc.freenode.net:6667\", \"kittybot\", saslOption)\n// Handle err as you like\n\nbot.Run() # Blocks until disconnect.\n```\n\nNote: SASL does not require SSL but can be used in combination.\n\n## Passwords\n\nFor servers that require passwords in the initial registration, simply set\nthe Password field of the Bot struct before calling its Start method.\n\n## Debugging\n\nHellabot uses github.com/inconshreveable/log15 for logging.\nSee [http://godoc.org/github.com/inconshreveable/log15](http://godoc.org/github.com/inconshreveable/log15)\n\nBy default, it discards all logs. To see any logs, give it a better handler.\nExample: This would only show INFO level and above logs, logging to STDOUT\n\n```go\nimport log \"gopkg.in/inconshreveable/log15.v2\"\n\nlogHandler := log.LvlFilterHandler(log.LvlInfo, log.StdoutHandler)\nbot.Logger.SetHandler(logHandler)\n```\n\nNote: This might be revisited in the future.\n\n## Why\n\nWhat do you need an IRC bot for you ask? Well, I've gone through the trouble of\ncompiling a list of fun things for you! The following are some of the things KittyBot is\ncurrently being used for:\n\n- AutoOp Bot: ops you when you join the channel\n- Stats counting bot: counts how often people talk in a channel\n- Mock users, you don't like by repeating what they say\n- Fire a USB dart launcher on a given command\n- Control an MPD radio stream based on chat commands\n- Award praise to people for guessing a random number\n- Scrape news sites for relevant articles and send them to a channel\n- And many other 'fun' things!\n\n## References\n\n[Client Protocol, RFC 2812](http://tools.ietf.org/html/rfc2812)\n[SASL Authentication Documentation](https://tools.ietf.org/html/draft-mitchell-irc-capabilities-01)\n[IRCv3 Documentation](https://ircv3.net/irc/)\n\n## Contributors before the hard fork\n\n- @[sorcix](https://github.com/sorcix)\n- @[whyrusleeping](https://github.com/whyrusleeping)\n- @[flexd](https://github.com/flexd)\n- @[icholy](https://github.com/icholy)\n- @[bbriggs](https://github.com/bbriggs)\n- @[Luzifer](https://github.com/Luzifer)\n- @[mudler](https://github.com/mudler)\n- @[jonreyna](https://github.com/jonreyna)\n- @[miloprice](https://github.com/miloprice)\n- @[m-242](https://github.com/m-242)\n- @[antifuchs](https://github.com/antifuchs)\n- @[JReyLBC](https://github.com/)\n- @[ForrestWeston](https://github.com/ForrestWeston)\n- @[affankingkhan](https://github.com/affankingkhan)\n- @[Villawhatever](https://github.com/Villawhatever)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fugjka%2Fkittybot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fugjka%2Fkittybot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fugjka%2Fkittybot/lists"}