added topic thing and probably other stuff

This commit is contained in:
iou1name 2018-02-25 17:19:53 -05:00
parent 6ef18ff0be
commit 0723754012
4 changed files with 233 additions and 39 deletions

View File

@ -129,9 +129,9 @@ def kickban(bot, trigger):
@require_chanmsg @require_chanmsg
@require_privilege(OP, 'You are not a channel operator.') @require_privilege(OP, 'You are not a channel operator.')
@commands('topic') @commands('oldtopic')
@example(".topic We're discussing penises, would you like to join?") @example(".oldtopic We're discussing penises, would you like to join?")
def topic(bot, trigger): def oldtopic(bot, trigger):
""" """
This gives ops the ability to change the topic. This gives ops the ability to change the topic.
The bot must be a Channel Operator for this command to work. The bot must be a Channel Operator for this command to work.

View File

@ -1,46 +1,166 @@
#! /usr/bin/env python3 #!/usr/bin/env python3
# coding=utf-8
""" """
Resistor color band codes. Resistor color band codes.
""" """
import re
import argparse
import module import module
@module.commands('resist') suffix = {"k": 1000, "m": 10000000}
@module.example('.resist 10k', 'brown black orange gold')
sigfig = {"black": 0,
"brown": 1,
"red": 2,
"orange": 3,
"yellow": 4,
"green": 5,
"blue": 6,
"violet": 7,
"grey": 8,
"white": 9}
sigfig_inverse = {val: key for key, val in sigfig.items()}
multiplier = {"black": 1,
"brown": 10,
"red": 100,
"orange": 1000,
"yellow": 10000,
"green": 100000,
"blue": 1000000,
"violet": 10000000,
"grey": 100000000,
"white": 1000000000,
"gold": 0.1,
"silver": 0.01}
multiplier_inverse = {val: key for key, val in multiplier.items()}
tolerance = {"brown": "±1%",
"red": "±2%",
"green": "±0.5%",
"blue": "±0.25%",
"violet": "±0.1%",
"grey": "±0.05%",
"gold": "±5%",
"silver": "±10%",
"none": "±20%"}
temp_coeff = {"black": "250 ppm",
"brown": "100 ppm",
"red": "50 ppm",
"orange": "15 ppm",
"yellow": "25 ppm",
"blue": "10 ppm",
"violet": "5 ppm"}
@module.commands("resist")
@module.example(".resist 10k", "brown black orange gold")
def resist(bot, trigger): def resist(bot, trigger):
"""Displays the color band code of a resistor for the given resistance.""" """
suffix = {'k': 1000, 'm': 10000000} Displays the color band code of a resistor for the given resistance.
digit = {'0': 'black', '1': 'brown', '2': 'red', '3': 'orange', '4': 'yellow', """
'5': 'green', '6': 'blue', '7': 'violet', '8': 'grey', '9': 'white', if not trigger.group(2):
'-1': 'gold', '-2': 'silver'} return bot.say("Please specify a value")
parser = argparse.ArgumentParser()
parser.add_argument("value", nargs="+")
parser.add_argument("-r", "--reverse", action="store_true")
parser.add_argument("-n", "--num_bands", type=int, choices=[3,4,5,6], default=4)
args = parser.parse_args(trigger.group(2).split())
if not trigger.group(2)[-1].isdigit(): if args.reverse: # bands-to-value
value = trigger.group(2)[:-1] bot.say(bands_to_value(" ".join(args.value)))
else: # value-to-band
if len(args.value) > 1:
return bot.say("Too many values.")
value = args.value[0].lower()
mul = 1
if value[-1] in ["k", "m"]:
mul = suffix[value[-1]]
value = value[:-1]
try:
value = float(value) * mul
except ValueError:
return bot.say("Invalid input.")
return bot.say(value_to_band(value, args.num_bands))
def value_to_band(value, num_bands=4):
"""
Converts a given resistance value to a color band code.
"""
if value < 1:
return "Value too small. Maybe this will be fixed in the future."
else: else:
value = trigger.group(2) if num_bands > 4:
value = float(format(value, ".3g"))
else:
value = float(format(value, ".2g"))
value = re.sub("\.0$", "", str(value))
bands = []
mul = ""
try: if "." in value:
value = float(value) if value[-2] == ".":
except ValueError: mul = 0.1
return 'Invalid input' elif value[-3] == ".":
mul = 0.01
else:
return "Error with sigfigs."
value = value.replace(".", "")
if not trigger.group(2)[-1].isdigit(): val1 = int(value[0])
value = value * suffix[trigger.group(2)[-1]] val2 = int(value[1])
valueStr = str(value) bands.append(sigfig_inverse[val1])
bands.append(sigfig_inverse[val2])
if value >= 10: if num_bands > 4:
colorCode = digit[valueStr[0]] + " " + digit[valueStr[1]] + " " value = value.ljust(4,"0")
val3 = int(value[2])
bands.append(sigfig_inverse[val3])
if not mul:
mul = 10**(len(value) - len(value.rstrip("0")))
bands.append(multiplier_inverse[mul])
# TODO: better tolerance
bands.append("gold")
if num_bands == 3:
return " ".join(bands)
# TODO: better temp coeff
if num_bands == 6:
bands.append("red")
return " ".join(bands)
def bands_to_value(bands):
"""
Converts the given color band code into a resistance value.
"""
bands = bands.lower().split()
ret = []
if len(bands) > 4:
value = bands[:3]
bands = bands[3:]
else: else:
colorCode = digit[valueStr[2]] + " " + digit['0'] + " " value = bands[:2]
bands = bands[2:]
value = [sigfig[v] for v in value]
if value < 0.1: prod = ""
return "Value to small. Just like your dick." for x in value:
elif value < 1: prod += str(x)
colorCode = colorCode + digit['-2'] prod = float(prod) * multiplier[bands[0]]
elif value < 10:
colorCode = colorCode + digit['-1'] if len(bands) == 1:
else: return " ".join([str(prod), tolerance["none"]])
colorCode = colorCode + digit[str(len(valueStr)-4)] if len(bands) == 2:
return " ".join([str(prod), tolerance[bands[1]]])
if len(bands) == 3:
return " ".join([str(prod), tolerance[bands[1]], temp_coeff[bands[2]]])
colorCode = colorCode + " gold"
bot.say(colorCode)

65
modules/topic.py Executable file
View File

@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""
This module allows you to add topics to a list in the database and cycle
through them.
"""
import os
import threading
import random
from module import commands, example
def setup(bot):
"""
Attempts to create the table in the database if it's not found.
"""
bot.memory['topic_lock'] = threading.Lock()
con = bot.db.connect()
cur = con.cursor()
try:
cur.execute("SELECT * FROM topic").fetchone()
except:
cur.execute("CREATE TABLE topic("
"topic STRING PRIMARY KEY,"
"added_by STRING,"
"added_date INT DEFAULT (STRFTIME('%s', 'now')))")
con.commit()
con.close()
@commands('topic')
def topic(bot, trigger):
"""
Picks a random topic from the database and applies it.
"""
channel = trigger.sender
con = bot.db.connect()
cur = con.cursor()
cur.execute("SELECT topic FROM topic ORDER BY RANDOM() LIMIT 1;")
topic = cur.fetchone()[0]
con.close()
bot.write(('TOPIC', channel + ' :' + topic))
@commands('addtopic')
@example('.addtopic Daily reminder to kill all cia niggers on site.')
def addTopic(bot, trigger):
"""
Adds the specified topic to the topic database.
"""
bot.memory['topic_lock'].acquire()
topic = trigger.group(2)
con = bot.db.connect()
cur = con.cursor()
insert = (topic, trigger.nick)
try:
cur.execute("INSERT INTO topic (topic, added_by) VALUES(?,?)",
insert)
confirm = "Added topic: " + topic
except sqlite3.IntegrityError:
confirm = "Error: " + topic + " is already in the database."
con.commit()
con.close()
bot.memory['topic_lock'].release()
bot.say(confirm)

View File

@ -131,15 +131,21 @@ def unwatch(bot, trigger):
bot.memory["watcher"].pop(url) bot.memory["watcher"].pop(url)
except KeyError: except KeyError:
return bot.say("Error: I'm not watching that thread.") return bot.say("Error: I'm not watching that thread.")
removeThread(bot, get_api_url(url),)
bot.say("[\x0304Watcher\x03] No longer watching: \x0307" + url)
def removeThread(bot, url):
"""
Removes the provided thread from the database. This should be the API url.
"""
con = bot.db.connect() con = bot.db.connect()
cur = con.cursor() cur = con.cursor()
cur.execute("DELETE FROM watcher WHERE api_url = ?", (get_api_url(url),)) cur.execute("DELETE FROM watcher WHERE api_url = ?", (url,))
con.commit() con.commit()
con.close() con.close()
bot.say("[\x0304Watcher\x03] No longer watching: \x0307" + url)
class WatcherThread(threading.Thread): class WatcherThread(threading.Thread):
def __init__(self, bot, api_url, name, last_post, time_since, channel): def __init__(self, bot, api_url, name, last_post, time_since, channel):
@ -171,6 +177,7 @@ class WatcherThread(threading.Thread):
msg = "[\x0304Watcher\x03] Thread deleted: " \ msg = "[\x0304Watcher\x03] Thread deleted: " \
+ f"\x0307{get_thread_url(self.api_url)}" + f"\x0307{get_thread_url(self.api_url)}"
self.bot.say(msg, self.channel) self.bot.say(msg, self.channel)
removeThread(self.bot, api_url)
self.stop.set() self.stop.set()
continue continue
@ -182,6 +189,7 @@ class WatcherThread(threading.Thread):
msg = "[\x0304Watcher\x03] Thread closed: " \ msg = "[\x0304Watcher\x03] Thread closed: " \
+ f"\x0307{get_thread_url(self.api_url)}" + f"\x0307{get_thread_url(self.api_url)}"
self.bot.say(msg, self.channel) self.bot.say(msg, self.channel)
removeThread(self.bot, api_url)
self.stop.set() self.stop.set()
continue continue
@ -189,6 +197,7 @@ class WatcherThread(threading.Thread):
if new_last_post > self.last_post: if new_last_post > self.last_post:
self.last_post = new_last_post self.last_post = new_last_post
msg = "[\x0304Watcher\x03] New post from \x0308" \ msg = "[\x0304Watcher\x03] New post from \x0308" \
+ f"{self.name}\x03 in \x0307{get_thread_url(self.api_url)}" + f"{self.name}\x03: \x0307{get_thread_url(self.api_url)}"
+ f"#{self.last_post}"
self.bot.say(msg, self.channel) self.bot.say(msg, self.channel)