HoneyBot is a python-based IRC bot. (python3.7) | If you want to just run the bot, go to the quick start section
Feel free to contribute to the project!
Implementing the project in Java was weird, py's connect was sleek. Thus, the project stack was shifted over to Python. If you can think of any features, plugins, or functionality you wish to see in the project. Feel free to add it yourself, or create an issue detailing your ideas. We highly recommend you attempt to implement it yourself first and ask for help in our discord server !
Psst. since i learnt py through this bot, we decided to keep a new-comers friendly policy. Feeling lost? Just ping.
🇲🇺 🇺🇸 🇨🇦 🇦🇷 🇮🇳 🇬🇧 🇬🇬 🇧🇷 🇸🇽 🇵🇱 🇩🇪
get issues delivered in your inbox.
With experience in programming in Python, and implementing an SMTP email plugin for a different system, picking up HoneyBot and following the documentation provided for new-comers made it very simple to implement the same SMTP email plugin to the HoneyBot system. This was my first time contributing to an open-source project on GitHub and it was an overall great experience. The welcoming of new contributors and documentation on how to contribute and implement plugins is great for people who have never contributed to a project before, and Abdur-Rahmaan Janhangeer was extremely helpful when answering my questions and helping me along the way.
HoneyBot is my first time collaborating to an open source project and I'm loving it. Before discovering HoneyBot, I was very intimidated on the idea of working with other people and had no idea what an IRC even was. Now I realize how much fun and rewarding it is to work together on a project with dedicated and friendly individuals. The documentation is easy to follow and everyone is super helpful. I highly recommend any new programmer who want to contribute on an open source project to try out HoneyBot. Personally I enjoy working on this project more than my own schoolwork.
HoneyBot is my first open source project and I had never worked with an IRC before. For school I was required to contribute to projects, but it was always so intimidating to me. I had always heard it gets easier once you've gotten over the fear wall, and that's what HoneyBot did for me. Excellent readme and quick feedback allowed me to make my first plugin. Now I've made many contributions, and look forward to any new issues I can get my hands on. Abdur-Rahmaan Janhangeer has been extremely helpful and I owe him and this project a lot for getting me into the open source world.
HoneyBot is a very friendly and welcoming community. They provided quick feedback and I would defenitely recommend this project to newcomers to give them that first boost on contributing to open source. HoneyBot helps you all the way there to issuing your first PR, step by step. I contributed a comic plugin, and I was thankful for meeting all the friendly and passionate people who are active in this community.
I came onto this project in October of 2018. At the time, my experience with open source was nil. I wasn't even sure I was good with python; I just happened to be better than everyone in class. Working on HoneyBot really opened my eyes to the power of community and programming, and has sent me on a path I don't wanna turn from. Just seeing how this project has evolved over the past year and how I've grown with it, I wouldn't trade it for the world. My name might not be on any of the recent plugins or doc strings, but I'll never forget that it'll always be tied to this project and a lot of the code. Also, I don't know if they'll check my commit so go look at the C++ Client! It's cool I promise!
- 🍬 OOP architecture
- 🛰️ keyword parameters
- 🌵 password security with config file [disabled for now]
- 🔌 now with plugins
GUI clients are used to manage plugins, launch bot as well as specify credentials.
- 💎 bitcoin by @Macr0Nerd - get price of bitcoin
- ⏲ caesar cipher by @kylegalloway - encode your text
- 🔢 calc by @Abdur-rahmaanJ - evaluates maths expressions
- 📐 maths by @Abdur-rahmaanJ - sin cos and the like
- 🍃 conv sniff by @Abdur-rahmaanJ - set triggers like how many times a word occur for one or more words and send response
- ❄ greet by @Abdur-rahmaanJ - demo plugin
- ⛓ installed_modules by @Abdur-rahmaanJ - checks dependencies installed
- 🕶 joke by @Abdur-rahmaanJ, @colbyjayallen - get random joke
- ❓ self Trivia by @ajimenezUCLA - random trivia
- 💢 username by @Abdur-rahmaanJ, @sseryani - username generator
- 📜 quotes by @German-Corpaz - inspirational quotes
- 📖 dictionary by @iamnishant14 - returns meaning of word
- 🔣 password generator by @iamnishant14 - the name tells it all
- 🐜 debug by @Abdur-rahmaanJ - prints all parameters passed to bot
- 📚 wikipedia by @Macr0Nerd - returns a wikipedia article
- 🗿 translate by @a-deeb - google translate plugin
- 📑 test by @Abdur-rahmaanJ - runs tests
- ⛅️ weather by @Macr0Nerd - returns weather info for a given location
- ✉️ mail by @TannerFry - send emails within the chat
- 🕴️ hangman by @JustinWalker4179 - play hangman in the chat
- 🎂 age by @JustinWalker4179 - takes in birthday and outputs age
- ✔️ fact by @JustinWalker4179 - returns a random fact
- 🔍 google by @JustinWalker4179 - returns three search results from google
- 📮 send message by @JustinWalker4179 - sends a message to another channel
- 📝 log by @RiceAbove - logs the chat into a log file
- 🚪 joins by @RiceAbove - greets everyone who joins the channel
- 📅 date by @RiceAbove - posts the current date
- 🕵️ riddle by @AngeloGiacco - returns a random riddle
- 🗞 news by @AngeloGiacco - gets the top 10 headlines from bbc world news
- 📝 horoscope by @AngeloGiacco - gets your daily horoscope for your starsign
- 💵 currency converter by @AngeloGiacco - converts currencies
- 🔫 russian_roulette by @AngeloGiacco - may or may not kick you off the channel
- 🏨 monopoly by @AngeloGiacco - Honeybot now supports the world's worst game!
- ⚽️ transfer_rumour by @AngeloGiacco - shows the day's transfer rumours
- 🃏 blackjack/21 by @AngeloGiacco - play 21 on honeybot!
- 🎲 roll by @GlennToms - rolls a dice
- ❓ help by @edumello - show link to plugin's information page
- ✅ channeljoin by @marceloyb - join command for bot
- 📃 comic by @mboekhold - returns a random comic
- 📝 todo by @h-ranjan1110 - Makes a to do list .
- 🎱 Magic 8 Ball @ZakariaTalhami - Answer questions using magic 8 ball
Change SERVER, PORT and NICKNAME variables to match your preferences
docker build -t honeybot -f ./docker/Dockerfile .
docker run honeybot
including it here. let's begin
a plugin has the following structure:
# -*- coding: utf-8 -*-
"""
[greet.py]
Greet Plugin
[Author]
Abdur-Rahmaan Janhangeer, pythonmembers.club
[About]
responds to .hi, demo of a basic plugin
[Commands]
>>> .hi
returns hoo
"""
class Plugin:
def __init__(self):
pass
def run(self, incoming, methods, info, bot_info):
try:
if info['command'] == 'PRIVMSG' and info['args'][1] == '.hi':
methods['send'](info['address'], 'hooo')
except Exception as e:
print('woops plugin error ', e)
we see four parameters being passed to the run method , incoming, methods, info, bot_info)
incoming
is the raw line and is not used except if you are not satisfied with the already provided methods
methods
is a dictionary of methods to ease your life. a quick look at main.py reveals
def methods(self):
return {
'send_raw': self.send,
'send': self.send_target,
'join': self.join
}
where send_raw
allows you to send in any string you want, thereby allowing you to implement any irc protocol from scratch
but, for most uses, send
allows you to send a message to an address methods['send']('<address>', '<message>')
. using it in conjunction with info parameter allows you to send messages where it came from, in pm to the bot or in a channel. you can however hardcode the address.
join
allows you to join a channel by methods['join']('<channel name>')
for a normal run, info produces
{
'prefix': 'appinv!c5e342c5@gateway/web/cgi-irc/kiwiirc.com/ip.200.200.22.200',
'command': 'PRIVMSG',
'address': '##bottestingmu',
'args': ['##bottestingmu', 'ef']
}
hence if you want messages, messages = info['args'][1:]
or the first word if you want to check for command will be info['args'][1]
use example
- the command info is used in the join channel plugin to detect a join command and greet the user who just joined
bot_info returns info about the bot
return {
'name': self.name,
'special_command': self.sp_command,
'required_modules': self.required_modules,
'owners': self.owners,
'time': self.time,
'friends': self.friends
}
so that in run method you can access those.
use example
- For example, the time info is used in the uptime plugin by minussing it from the current time to get time bot has been running.
- The required modules is used in the installed plugin to determine what required plugin the bot runner did not install
hence
if info['command'] == 'PRIVMSG' and info['args'][1] == '.hi':
methods['send'](info['address'], 'hooo')
from above means
if message received == .hi:
send(address, message)
- specify your details in CONNECT.conf (already included)
[INFO]
server_url = chat.freenode.net
port = 6667
name = appinventormuBot
- run run.py
Get an IRC client
- Web: Kiwiirc (easy)
- Desktop: Hexchat
- Android: Revolution IRC
configure
port: 6667
url: chat.freenode.net
then join channel #ltch
you should see the bot as hbot ... or as it's name is in settings
- don't forget to add your country flag here after accepted PR. i'll have to hunt it down on your profile if not.
- make sure to follow PEP8
Documentation
A small guide on how to contribute to the documentation of the project can be found here
about PR
first clone the project
git clone https://github.com/pyhoneybot/honeybot.git
cd into the project
cd honeybot
different changes to different files. for example, someone making a weather plugin first he creates a new branch
git checkout -b "weather-plugin"
then he commits
git add *
git commit -m "added weather plugin"
or
git commit -a -m "did this"
then he push to create a PR with the branch
git push origin head
or
git push origin weather-plugin
now let us say he wants to work on another issue, adding a joke in the jokes plugin, he creates another branch
git checkout -b "add-jokes"
after, same as before
git add *
git commit -m "added some jokes"
git push origin head
now he wants to fix his weather plugin, he changes branch
git checkout weather-plugin
works, then commit
git add *
git commit -m "fixed <issue>"
then a PR
git push origin head
Why all these?
So as not to reject a whole PR just because of some oddities. Reject only unneeded part.
Now, other changes are ongoing, what if you need the latest changes?
git pull origin master
helps if you cloned your own repo. What if you want to update your local copy of someone else's repo that you forked? You do it like that
cd <your/local/cloned/repo/path/here>
git remote add upstream https://github.com/pyhoneybot/honeybot.git
git fetch upstream
git pull upstream master
- 💐 humour
- 🌨️ weather
- 🎛️ maths
- 📥 pm when user online
- Random Colour
in PLUGINS.conf, add the plugin to allow on a new line !
calc
username
- Abdur-Rahmaan Janhangeer | [email protected]
@arwinneil for opensource and madeinmoris badges