Compare commits

..

No commits in common. "a7b0de90bfea2c6b44e69ccc1650fb693714f623" and "1b71e73757936161e4363e45b74c6bd28d4e519a" have entirely different histories.

21 changed files with 210 additions and 29 deletions

View File

@ -3,4 +3,11 @@ It's like Sopel, except rewritten from scratch using Twisted as a base and over
## Requirements ## Requirements
Python 3.6+ Python 3.6+
Python packages: `twisted python-dateutil requests bs4 wolframalpha emoji pillow ipython numpy numpngw` System packages: `enchant`
Python packages: `twisted python-dateutil requests bs4 wolframalpha pyenchant emoji pillow ipython numpy numpngw`
## TODO
Fix the movie table
Consider re-adding the following modules: `etymology, ip`
Add CTCP responses
More complex versioning

View File

@ -14,7 +14,7 @@ op = ['~', '!', '@', '%']
@module.require_chanmsg @module.require_chanmsg
@module.require_admin @module.require_admin
@module.commands('kick') @module.commands('kick')
@module.example(".kick Rob It's time to stop.") @module.example(".kick faggot being a faggot")
def kick(bot, trigger): def kick(bot, trigger):
""" """
Kick a user from the channel. Kick a user from the channel.
@ -38,7 +38,7 @@ def kick(bot, trigger):
@module.require_chanmsg @module.require_chanmsg
@module.require_admin @module.require_admin
@module.commands('ban') @module.commands('ban')
@module.example(".ban Rob") @module.example(".ban faggot")
def ban(bot, trigger): def ban(bot, trigger):
""" """
This give admins the ability to ban a user. This give admins the ability to ban a user.
@ -56,7 +56,7 @@ def ban(bot, trigger):
@module.require_chanmsg @module.require_chanmsg
@module.require_admin @module.require_admin
@module.commands('unban') @module.commands('unban')
@module.example(".unban Rob") @module.example(".unban faggot")
def unban(bot, trigger): def unban(bot, trigger):
""" """
This give admins the ability to unban a user. This give admins the ability to unban a user.
@ -74,7 +74,6 @@ def unban(bot, trigger):
@module.require_chanmsg @module.require_chanmsg
@module.require_admin @module.require_admin
@module.commands('kickban') @module.commands('kickban')
@module.example(".kickban Rob It's time to stop.")
def kickban(bot, trigger): def kickban(bot, trigger):
""" """
This gives admins the ability to kickban a user. This gives admins the ability to kickban a user.

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python3 #! /usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
Marks a user as away with an optional message and informs anyone who attempt Marks a user as away with an optional message and informs anyone who attempt
to ping them of their away status. Goes away when the user talks again. to ping them of their away status. Goes away when the user talks again.

View File

@ -10,7 +10,7 @@ from module import commands, example, require_admin
from tools import configureHostMask from tools import configureHostMask
@commands('banhe') @commands('banhe')
@example('.banhe Rob 30m') @example('.banhe assfaggot 30m')
def banhe(bot, trigger): def banhe(bot, trigger):
""" """
Bans he for a set period of time. Admins may set the period of time, Bans he for a set period of time. Admins may set the period of time,
@ -32,7 +32,7 @@ def banhe(bot, trigger):
bot.mode(trigger.channel, True, "b", mask=banmask) bot.mode(trigger.channel, True, "b", mask=banmask)
if period > 2592000: if period > 2592000:
bot.reply("Onii-chan, It's too big!") bot.reply("It's too big, Onii-chan.")
if not period or period > 2592000: if not period or period > 2592000:
return bot.msg(f"Banned \x0304{banhee}\x03 for \x0309∞\x03 seconds.") return bot.msg(f"Banned \x0304{banhee}\x03 for \x0309∞\x03 seconds.")
@ -60,7 +60,7 @@ def banheall(bot, trigger):
bot.mode(trigger.channel, True, "b", mask=banmask) bot.mode(trigger.channel, True, "b", mask=banmask)
if period > 2592000: if period > 2592000:
bot.reply("Onii-chan, It's too big!") bot.reply("It's too big, Onii-chan.")
if not period or period > 2592000: if not period or period > 2592000:
return bot.msg("Banned \x0304them all\x03 for \x0309∞\x03 seconds.") return bot.msg("Banned \x0304them all\x03 for \x0309∞\x03 seconds.")

32
modules/countdown.py Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env python3
"""
Provides a countdown to some particular date.
"""
from datetime import datetime
from module import commands, example
from tools.time import relativeTime
@commands("countdown")
@example(".countdown 2012 12 21")
def generic_countdown(bot, trigger):
"""
.countdown <year> <month> <day> - displays a countdown to a given date.
"""
if len(trigger.args) < 2:
return bot.msg("Please use correct format: .countdown 2012 12 21")
text = trigger.args[1]
text = text.split()
if (len(text) != 3 or not text[0].isdigit() or not text[1].isdigit()
or not text[2].isdigit()):
return bot.msg("Please use correct format: .countdown 2012 12 21")
try:
date = datetime(int(text[0]), int(text[1]), int(text[2]))
except:
return bot.msg("Please use correct format: .countdown 2012 12 21")
msg = relativeTime(datetime.now(), date)
msg += " until " + trigger.args[1]
bot.msg(msg)

View File

@ -34,7 +34,7 @@ def setup(bot):
@commands("hangman", "hm") @commands("hangman", "hm")
@example(".hangman --start") @example(".hangman --start")
@example(".hm substation") @example(".hm anus")
def hangman(bot, trigger): def hangman(bot, trigger):
""" """
Plays hangman. --start [-s] to start a new game, otherwise words are Plays hangman. --start [-s] to start a new game, otherwise words are

60
modules/iot.py Executable file
View File

@ -0,0 +1,60 @@
#!/usr/bin/env python3
"""
Long live the Internet of Things!
"""
import requests
import module
@module.require_admin
@module.commands('lamp')
def lampToggle(bot, trigger):
"""
Turns my lamp on and off. The glory of IoT!
"""
try:
res = requests.get("http://192.168.1.12/gpio?0=toggle", timeout=10)
except requests.exceptions.ReadTimeout:
return bot.msg("Connection error. Timeout reached.")
except requests.exceptions.ConnectionError:
return bot.msg("Connection error. Is the unit dead?")
if res.text[32] == 'L':
bot.msg("Lamp is now OFF.")
elif res.text[32] == 'H':
bot.msg("Lamp is now ON.")
#@module.require_admin
@module.commands('roomtemp')
def roomTemp(bot, trigger):
"""
Gets the temperature of my room.
"""
try:
res = requests.get("http://192.168.1.25/", timeout=10)
except requests.exceptions.ReadTimeout:
return bot.msg("Connection error. Timeout reached.")
except requests.exceptions.ConnectionError:
return bot.msg("Connection error. Is the unit dead?")
bot.msg(res.text)
@module.require_admin
@module.commands('inkwrite')
def inkWrite(bot, trigger):
"""
Writes shit to my e-ink screen.
"""
text = trigger.replace(".inkwrite ", "")
if not text:
return bot.msg("Need something to write.")
try:
res = requests.get(f"http://192.168.1.125:8000/?text={text}",
timeout=10)
except requests.exceptions.ReadTimeout:
return bot.msg("Connection error. Timeout reached.")
except requests.exceptions.ConnectionError:
return bot.msg("Connection error. Is the unit dead?")
bot.msg("Wrote: " + res.text)

12
modules/lmgtfy.py Executable file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env python3
"""
Let me google that for you.
"""
from module import commands
@commands('lmgtfy')
def googleit(bot, trigger):
"""Let me just... google that for you."""
if len(trigger.args) < 2:
return bot.msg('http://google.com/')
bot.msg('http://lmgtfy.com/?q=' + trigger.args[1].replace(' ', '+'))

23
modules/minecraft.py Executable file
View File

@ -0,0 +1,23 @@
#!/usr/bin/env python3
"""
Minecraft is a well-crafted program.
"""
import subprocess
import module
@module.require_admin
@module.commands('mc_start')
def minecraft_start_server(bot, trigger):
"""
Starts the minecraft server in case it crashes.
"""
cmd = ["tmux", "send", "-t", "main:2", "./start.sh", "ENTER"]
cmd_re = ["tmux", "send", "-t", "main:2", "^C", "ENTER"]
msg = "Start signal sent to the minecraft server."
if len(trigger.args) >= 2:
msg = "Re-" + msg
subprocess.run(cmd_re, check=True)
subprocess.run(cmd, check=True)
bot.msg(msg)

View File

@ -157,8 +157,7 @@ def pickMovie(bot, trigger):
@require_admin @require_admin
@commands('addmovie') @commands('addmovie')
@example('.addmovie Dr. Strangelove or: How I Learned to Stop Worrying and " @example('.addmovie Gay Niggers From Outer Space')
"Love the Bomb')
def addMovie(bot, trigger): def addMovie(bot, trigger):
""" """
Adds the specified movie to the movie database. Adds the specified movie to the movie database.

View File

@ -11,6 +11,7 @@ def pingAll(bot, trigger):
attention, or just annoy them. attention, or just annoy them.
""" """
nicks = list(bot.channels[trigger.channel].users.keys()) nicks = list(bot.channels[trigger.channel].users.keys())
second_class_citizens = ["Ishd", "Ishd2", "Ishd_"] for nigger in ["Ishd", "Ishd2", "Ishd_"]:
nicks = [n for n in nicks if n not in second_class_citizens] if nigger in nicks:
nicks.remove(nigger)
bot.msg(" ".join(nicks)) bot.msg(" ".join(nicks))

View File

@ -17,7 +17,7 @@ def f_reload(bot, trigger):
return boy.reply("Reload what?") return boy.reply("Reload what?")
name = trigger.args[1] name = trigger.args[1]
if name == "*": if name == "*" or name.upper() == "ALL THE THINGS":
bot.load_modules() bot.load_modules()
return bot.msg("done") return bot.msg("done")

View File

@ -148,22 +148,23 @@ def remind(bot, trigger):
@commands('at') @commands('at')
@example('.at 2012-12-21 18:00:00 End the world.') @example('.at 13:47 Do your homework!')
@example('.at 16:30UTC-5 Do cocaine')
@example('.at 14:45:45 Remove dick from oven')
def at(bot, trigger): def at(bot, trigger):
""" """
Gives you a reminder at the given time and date. Datetime must be in Gives you a reminder at the given time and date. Datetime must be in
YYYY-MM-DD HH:MM:SS format. Only the bot's timezone is used. YYYY-MM-DD HH:MM:SS format. Only the bot's timezone is used.
""" """
if len(trigger.args) < 3: if len(trigger.args) == 1:
return bot.msg("Missing arguments for reminder command.") return bot.msg("Missing arguments for reminder command.")
if len(trigger.args) < 4: if len(trigger.args) == 2:
reminder = '' reminder = ''
else: else:
reminder = ' '.join(trigger.args[3:]) reminder = ' '.join(trigger.args[2:])
try: try:
at_time = datetime.strptime(' '.join(trigger.args[1:2]), at_time = datetime.strptime(trigger.args[1], '%Y-%m-%d %H:%M:%S')
'%Y-%m-%d %H:%M:%S')
except ValueError: except ValueError:
return bot.msg("Datetime improperly formatted.") return bot.msg("Datetime improperly formatted.")
diff = at_time - datetime.now() diff = at_time - datetime.now()

View File

@ -48,7 +48,7 @@ def setup(bot):
@commands("scramble", "sc") @commands("scramble", "sc")
@example(".scramble --start") @example(".scramble --start")
@example(".sc substation") @example(".sc anus")
def scramble(bot, trigger): def scramble(bot, trigger):
""" """
Plays scramble. --start [-s] to start a new game, otherwise arguments Plays scramble. --start [-s] to start a new game, otherwise arguments

View File

@ -1,7 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Correct the last thing you or someone else said. Uses standard sed Fulvia Spelling correction module
substitute notation eg. s/search/replace/flags
This module will fix spelling errors if someone corrects them
using the sed notation (s///) commonly found in vi/vim.
""" """
import re import re

View File

@ -53,8 +53,8 @@ def setup(bot):
@rate(1) @rate(1)
@commands('seen') @commands('seen')
@example(".seen Dad -l", "Last heard from Dad at [1997-03-12 16:30:00] "\ @example(".seen Nigger -l", "Last heard from Nigger at [1997-03-12 16:30:00] "\
+"with \"Just going to the store for some cigarettes I'll be right back\"") +"with \"Just going to the store for some smokes babe I'll be right back\"")
@example(".seen Soma_QM", "I haven't seen Soma_QM") @example(".seen Soma_QM", "I haven't seen Soma_QM")
def seen(bot, trigger): def seen(bot, trigger):
""" """

32
modules/spellcheck.py Executable file
View File

@ -0,0 +1,32 @@
#!/usr/bin/env python3
"""
Spell checking. Relies on the pyenchant module.
"""
import enchant
from module import commands, example
@commands('spellcheck', 'spell')
@example('.spellcheck stuff')
def spellcheck(bot, trigger):
"""
Says whether the given word is spelled correctly, and gives suggestions if
it's not.
"""
if len(trigger.args) < 2:
return bot.reply("What word?")
word = trigger.args[1]
if " " in word:
return bot.msg("One word at a time, please")
dictionary = enchant.Dict("en_US")
if dictionary.check(word):
bot.msg(word + " is spelled correctly")
else:
msg = f"{word} is not spelled correctly. Maybe you want one of " \
+ "these spellings: "
sugWords = []
for suggested_word in dictionary.suggest(word):
sugWords.append(suggested_word)
msg += ", ".join(sugWords)
bot.msg(msg)

View File

@ -43,7 +43,7 @@ def topic(bot, trigger):
@commands('addtopic') @commands('addtopic')
@example(".addtopic We're discussing penises, would you like to join?") @example('.addtopic Daily reminder to kill all cia niggers on site.')
def addTopic(bot, trigger): def addTopic(bot, trigger):
""" """
Adds the specified topic to the topic database. Adds the specified topic to the topic database.

View File

@ -10,7 +10,7 @@ import requests
from module import hook, url_callback from module import hook, url_callback
HEADERS = {"User-Agent": "Give me your data.", "Range": "bytes=0-4096"} HEADERS = {"User-Agent": "bix nood gimme the title", "Range": "bytes=0-4096"}
@url_callback('puu.sh/') @url_callback('puu.sh/')
def get_puush_fname(bot, url): def get_puush_fname(bot, url):
@ -70,5 +70,6 @@ def title_auto(bot, trigger):
title = res.text[res.text.find("<title>")+7:res.text.find("</title>")] title = res.text[res.text.find("<title>")+7:res.text.find("</title>")]
title = HTMLParser().unescape(title) title = HTMLParser().unescape(title)
title = title.replace("\n","").strip() title = title.replace("\n","").strip()
#title = title.encode("windows_1252").decode("utf-8")
hostname = urlparse(url).hostname hostname = urlparse(url).hostname
bot.msg(f"[ \x0310{title} \x03] - \x0304{hostname}") bot.msg(f"[ \x0310{title} \x03] - \x0304{hostname}")

10
modules/version.py Executable file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env python3
"""
The bot's version number.
"""
from module import commands
@commands('version')
def version(bot, trigger):
"""Displays the current version of Fulvia running."""
bot.reply("Fulvia v1.0.0")

View File

@ -12,6 +12,7 @@ def willilike(bot, trigger):
bot.reply("No.") bot.reply("No.")
@commands('upvote') @commands('upvote')
@example('.willilike Banished Quest')
def upvote(bot, trigger): def upvote(bot, trigger):
"""Upvotes a post made by someone.""" """An advanced AI that will determine if you like something."""
bot.msg(trigger.nick + " upvoted this post!") bot.msg(trigger.nick + " upvoted this post!")