diff --git a/databases/maple_db.json b/databases/maple_db.json new file mode 100644 index 0000000..d203d33 --- /dev/null +++ b/databases/maple_db.json @@ -0,0 +1,20 @@ +{ + "notes": { + "0": { + "from": "dr1p", + "note_msg": "yolo", + "time": "2021-11-02T09:51:39.616822", + "uuid": "02c416d754664b23938ecf5eb7e433c8" + } + }, + "quotes": { + "0": { + "message": "", + "user": "dr1p", + "uuid": "96b306f2af254fffa1a1feb72246f1bc" + } + }, + "staff_list": { + "0": "d!*dr1p@*" + } +} \ No newline at end of file diff --git a/maple.ini b/maple.ini index 874dd2a..8ff87f9 100644 --- a/maple.ini +++ b/maple.ini @@ -22,9 +22,19 @@ includes = plugins.emote_plugin plugins.youtube_plugin plugins.crypto_plugin - #plugins.auth_plugin + plugins.auth_plugin plugins.maple_plugin plugins.url_grabber_plugin + plugins.notes_plugin + plugins.quote_plugin + plugins.ratesex_plugin + plugins.remind_plugin + plugins.sed_plugin + plugins.seen_plugin + plugins.strain_plugin + plugins.tell_plugin + plugins.twitter_plugin + plugins.ud_plugin autojoins = ${#}phix diff --git a/plugins/auth_plugin.py b/plugins/auth_plugin.py new file mode 100644 index 0000000..649c8c7 --- /dev/null +++ b/plugins/auth_plugin.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.cron import cron +import irc3 +########################################################################################### +########################################################################################### +IRCNICKNAME ='BOTIRCNICK' +NICKSERVPASS='BOTPASSWORD' +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.CONNECTED) + def connected(self, **kw): + msg = f"identify {IRCNICKNAME} {NICKSERVPASS}" + self.bot.privmsg('NICKSERV',msg) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### +@cron('*/1 * * * *') +def cron_auth(bot): + if not bot.get_nick == 'maple': + msg = f"identify {IRCNICKNAME} {NICKSERVPASS}" + bot.privmsg('NICKSERV',msg) +########################################################################################### +########################################################################################### diff --git a/plugins/crypto_plugin.py b/plugins/crypto_plugin.py index b62f433..e2e5982 100644 --- a/plugins/crypto_plugin.py +++ b/plugins/crypto_plugin.py @@ -4,32 +4,37 @@ import irc3 import aiohttp import asyncio import async_timeout -import os -dir_path = os.path.dirname(os.path.realpath(__file__)) headers = { 'authorization': 'Apikey 94e50805f19646893ee16424918998caad5ec6accff539a23ffee8e546eda4e3' } - +########################################################################################### +########################################################################################### @irc3.plugin class Plugin: - + ####################################################################################### + ####################################################################################### def __init__(self, bot): self.bot = bot - + ####################################################################################### + ####################################################################################### @command(permission='view') def cc(self, mask, target, args): """Show Crypto Value %%cc """ + ################################################################################### + ################################################################################### coin = args[''].upper() async def fetch(session, url): async with async_timeout.timeout(10): async with session.get(url) as response: return await response.json() - + ################################################################################### + ################################################################################### async def grab_url(url): async with aiohttp.ClientSession(headers=headers) as session: json_response = await fetch(session, url) return json_response - + ################################################################################### + ################################################################################### def parse_coin(response): try: task_result, _ = response.result() @@ -56,8 +61,7 @@ class Plugin: H = float(price_multi.get('HIGHDAY')) # HIGH OF THE DAY L = float(price_multi.get('LOWDAY')) # LOW OF THE DAY A = float(price) # AGGREGATED EXCHANGE - Y = float(price_multi.get('CHANGE24HOUR')) - # PRICE PERCENT DIFFERENTIAL 24 HOURS AGO + Y = float(price_multi.get('CHANGE24HOUR')) # PRICE PERCENT DIFFERENTIAL 24 HOURS AGO C = float(price_multi.get('CHANGEPCT24HOUR')) if C <= 0: @@ -76,7 +80,8 @@ class Plugin: except Exception as e: msg = self.bot.emo('their api is glitching: check back later') self.bot.privmsg(target, msg) - + ################################################################################### + ################################################################################### def process_lookups(response): try: html = response.result() @@ -84,23 +89,24 @@ class Plugin: msg = self.bot.emo('site error: {}'.format(e.message)) self.bot.privmsg(target, msg) return - coin_result = html.get("Data",{}).get(coin, None) if not coin_result: msg = self.bot.emo('Invalid coin - see https://min-api.cryptocompare.com/data/all/coinlist data keys') self.bot.privmsg(target, msg) return - day_avg_url = "https://min-api.cryptocompare.com/data/dayAvg?fsym={}&tsym=USD&api_key=94e50805f19646893ee16424918998caad5ec6accff539a23ffee8e546eda4e3".format(coin) price_multi_url = "https://min-api.cryptocompare.com/data/pricemultifull?fsyms={}&tsyms=USD&api_key=94e50805f19646893ee16424918998caad5ec6accff539a23ffee8e546eda4e3".format(coin) price_url = "https://min-api.cryptocompare.com/data/price?fsym={}&tsyms=USD&api_key=94e50805f19646893ee16424918998caad5ec6accff539a23ffee8e546eda4e3".format(coin) - tasks = [asyncio.ensure_future(grab_url(day_avg_url)), asyncio.ensure_future(grab_url(price_multi_url)), asyncio.ensure_future(grab_url(price_url))] - task = self.bot.create_task(asyncio.wait(tasks)) task.add_done_callback(parse_coin) - + ################################################################################### + ################################################################################### url = "https://min-api.cryptocompare.com/data/all/coinlist" asyncio.ensure_future(grab_url(url), loop=self.bot.loop).add_done_callback(process_lookups) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/maple.py b/plugins/maple.py index f174a21..b13867a 100644 --- a/plugins/maple.py +++ b/plugins/maple.py @@ -1,7 +1,4 @@ -import sys import signal -import time -from os.path import exists import configparser import argparse import logging diff --git a/plugins/maple_plugin.py b/plugins/maple_plugin.py index 89e163b..1bc259f 100644 --- a/plugins/maple_plugin.py +++ b/plugins/maple_plugin.py @@ -3,12 +3,10 @@ ############################################################################################### import irc3 from irc3.plugins.cron import cron -from irc3.plugins.command import command ############################################################################################### ############################################################################################### import re import os -import random from difflib import SequenceMatcher ############################################################################################### ############################################################################################### @@ -61,18 +59,6 @@ class MESSAGE_HISTORY(): class Plugin: ########################################################################################### ########################################################################################### - def __emoj(self,s): - emote_db = '%s/../databases/emote.db' % dir_path - emoj = random.choice(list(open(emote_db))) - random.randint(0,1) - if random.randint(0,1) == 0: - emoj = "\x0304{}\x0F".format(emoj) - else: - emoj = "\x0303{}\x0F".format(emoj) - s = s + ' ▶ ' + emoj - return s - ########################################################################################### - ########################################################################################### def __init__(self, bot): self.bot = bot self.bot.history = MESSAGE_HISTORY() diff --git a/plugins/notes_plugin.py b/plugins/notes_plugin.py new file mode 100644 index 0000000..65871c0 --- /dev/null +++ b/plugins/notes_plugin.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +import irc3 +from datetime import datetime +import dateutil.parser +import timeago +import uuid +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + @command(permission='view', public=True, show_in_help_list=True) + def notes(self, *args, **kwargs): + """list/write/del notes + %%notes [] [] + """ + return self.note(*args) + ####################################################################################### + ####################################################################################### + @command(permission='view', public=True, show_in_help_list=True) + def note(self, mask, target, args): + """list/write/del notes + %%note [] [] + """ + cmd = args.get("") + if not cmd: + msg = "Please specify read/write/delete/list" + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + elif cmd in ["d","del","delete","remove"]: + self.note_del(mask, target, args) + elif cmd in ["w", "write","a", "add"]: + self.note_write(mask, target, args) + elif cmd in ["l", "list"]: + self.note_list(mask, target, args) + elif cmd in ["r", "read"]: + self.note_read(mask, target, args) + return + ####################################################################################### + ####################################################################################### + def note_del(self, mask, target, args): + """Delete Note or * for all notes + %%note + """ + note_uuid_hash = args.get("") + if not note_uuid_hash: + msg = "Please specify note" + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + if note_uuid_hash == "*": + self.bot.db.setlist("notes", []) + msg = "All notes cleared!" + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + else: + note_list = self.bot.db.getlist("notes", []) + if not note_list: + msg = "{} Not Found".format(note_uuid_hash) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + else: + if note_uuid_hash in [item.get("uuid") for item in note_list]: + new_note_list = [item for item in note_list if item.get("uuid") != note_uuid_hash] + self.bot.db.setlist("notes", new_note_list) + msg = "{} Removed".format(note_uuid_hash) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + ####################################################################################### + ####################################################################################### + def note_list(self, mask, target, args): + """List All Note Names + %%note list + """ + note_list = self.bot.db.getlist("notes") + if not note_list: + msg = "No notes!" + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + for note in note_list: + note_uuid = note.get("uuid") + note_from = note.get("from") + note_time = dateutil.parser.parse(note.get("time")) + note_time = timeago.format(note_time, datetime.now()) + note_msg = note.get("note_msg") + msg = "<{}> {} | {} | {}".format(note_from, note_time, note_msg, note_uuid) + self.bot.privmsg(target, msg) + ####################################################################################### + ####################################################################################### + def note_read(self, mask, target, args): + """Display Note + %%note read + """ + note_name = args.get("") + if not note_name: + msg = "Please specify name or note id" + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + note_list = self.bot.db.getlist("notes") + if not note_list: + msg = "No Notes in DB" + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + if not any(note_name in d["uuid"] for d in note_list): + msg = "No notes with {} found".format(note_name) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + else: + note = [d for d in note_list if d.get("uuid") == note_name] + if note: + note = note.pop() + else: + try: + note = note_list[int(note_name)] + except: + msg = "No notes with {} found".format(note_name) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + note_uuid = note.get("uuid") + note_from = note.get("from") + note_time = dateutil.parser.parse(note.get("time")) + note_time = timeago.format(note_time, datetime.now()) + note_msg = note.get("note_msg") + msg = "<{}> {} | {} | {}".format(note_from, note_time, note_msg, note_uuid) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + ####################################################################################### + ####################################################################################### + def note_write(self, mask, target, args): + """Add Note + %%note write + """ + note_msg = args.get("") + note_list = self.bot.db.getlist("notes") + if not note_list: + note_list = [] + self.bot.db.setlist("notes", note_list) + note_uuid = uuid.uuid4().hex + note = {"time": datetime.now().isoformat(), + "from": mask.nick, "uuid": note_uuid, + "note_msg": note_msg} + note_list.append(note) + self.bot.db.setlist("notes", note_list) + msg = "Note Added! {}".format(note_uuid) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/quote_plugin.py b/plugins/quote_plugin.py new file mode 100644 index 0000000..73f1057 --- /dev/null +++ b/plugins/quote_plugin.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +import irc3 +import random +import uuid +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self,bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.JOIN) + def quote_user_join(self, mask, channel, **kw): + """quote a user when they join""" + if mask.nick != self.bot.nick: + _UHOST = mask.host + quote_list = self.bot.db.getlist("quotes") + if not quote_list: + quote_list = [] + self.bot.db.setlist('quotes',[]) + quote_user = [] + for i in range(len(quote_list)): + if(quote_list[i]['user'] == mask.nick.lower()): + quote_user.append(quote_list[i]['message']) + if quote_user: + msg = random.choice(quote_user) + ' \x02\x0303▶\x0F ' + mask.nick + msg = self.bot.emo(msg) + target = channel + self.bot.privmsg(target,msg) + ####################################################################################### + ####################################################################################### + def __quote(self,user,message): + try: + quote_list = self.bot.db.getlist("quotes") + if not quote_list: + quote_list = [] + self.bot.db.setlist("quotes", quote_list) + quote_uuid = uuid.uuid4().hex + quote = {"user": user, + "message": message, + "uuid": quote_uuid} + quote_list.append(quote) + self.bot.db.setlist("quotes", quote_list) + msg = "TCPDIRECT/QUOTED: {} \x02\x0303▶\x0F {} \x02\x0303▶\x0F {}".format(user,message,quote_uuid) + return msg + except Exception as e: + return 'error: %s' % e.message[0]['message'] + ####################################################################################### + ####################################################################################### + @command(permission='view') + def quote(self, mask, target, args): + """quote user message + %%quote ... + """ + noise = ' '.join(args['']) + user = noise.split(' ')[0] + noise = noise.split(' ')[1:] + message = ' '.join(noise) + status = self.__quote(user.lower(),message) + msg = self.bot.emo(status) + self.bot.privmsg(target,msg) + ####################################################################################### + ####################################################################################### + @command(permission='view') + def quotes(self, mask, target, args): + """quotes user + %%quotes + """ + user = args.get("") + quote_list = self.bot.db.getlist("quotes") + if not quote_list: + quote_list = [] + self.bot.db.setlist('quotes',[]) + quote_user = [] + for i in range(len(quote_list)): + if(quote_list[i]['user'] == user): + quote_user.append(quote_list[i]['message']) + for i in range(len(quote_user)): + msg = user + ' \x02\x0303▶\x0F ' + quote_user[i] + msg = self.bot.emo(msg) + self.bot.privmsg(target,msg) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/ratesex_plugin.py b/plugins/ratesex_plugin.py new file mode 100644 index 0000000..8ef545f --- /dev/null +++ b/plugins/ratesex_plugin.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +from irc3.plugins.cron import cron +import irc3 +__doc__ = '''########################################################################################################## +####################################################################################################################''' +import os +import sys +import re +from urllib.request import Request, urlopen +from urllib.error import URLError, HTTPError +from random import randint +__doc__ = '''########################################################################################################## +####################################################################################################################### + +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh+MMMMMMMMMMMMMMhsMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMm/ oMMMMMMMMMMMMMMm +NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy` yMMMMMMMMMMMMMMM- -mMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMs+dMMMMMMMMMM+ sMMMMMMMMMMMMMMM- `dMMMMMMMMMMms/NMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMM+ .omMMMMMM: -MMMMMMMMMMMMMMo `yMMMMMMMy: `dMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMM- /dMMM+ sMMMMMMMMMMMMh `hMMMNo` sMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMd :dm `mMMMMMMMMMMN. .NNo` .MMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMM: - :MMMMMMMMMMs :` sMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMs ymNMMMMMNm. NMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMy `-/-` .MMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMo .NMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMNh+. :sdMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMhso+:. `-/+syMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMM- dMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMM` `.:+/. `/s+:. sMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMNo -oms. .//-` `:/:` `+md+` .hMMMMMMMMMMMMMMM +MMMMMMMMMMMMMNs` .odNdo. .ohmd+` :dMMMMMMMMMMMMM +MMMMMMMMMMMNo` .. .- :hMMMMMMMMMMM +MMMMMMMMMd+` -sNMMMMMMMM +MMMMMMNs- `.. `/-. `+dMMMMMM +MMMNy: ./sdNMMMh: `sNMMMNds/. .odMMM +MM+ :ymMMMMMMMMMMh. +NMMMMMMMMMMmo- /NM +MMMh: .sNMMMMMMMMMMMMMMN- `hMMMMMMMMMMMMMMMm+` :hMMM +MMMMMd:` ``-:+shmMMMMMMMMMMMMMMMMMMN. hMMMMMMMMMMMMMMMMMMMmhs+/-..``````./dMMMMM +MMMMMMMMMNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMo .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN. /MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN+` `+NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNs. -hMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMdyymMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM + +####################################################################################################################### +####################################################################################################################''' + +rgb2irc = { 52: '16', 94: '17', 100: '18', 58: '19', 22: '20', 29: '21', 23: '22', 24: '23', 17: '24', 54: '25', 53: '26', 89: '27', + 88: '28', 130: '29', 142: '30', 64: '31', 28: '32', 35: '33', 30: '34', 25: '35', 18: '36', 91: '37', 90: '38', 125: '39', + 124: '40', 166: '41', 184: '42', 106: '43', 34: '44', 49: '45', 37: '46', 33: '47', 19: '48', 129: '49', 127: '50', 161: '51', + 196: '52', 208: '53', 226: '54', 154: '55', 46: '56', 86: '57', 51: '58', 75: '59', 21: '60', 171: '61', 201: '62', 198: '63', + 203: '64', 215: '65', 227: '66', 191: '67', 83: '68', 122: '69', 87: '70', 111: '71', 63: '72', 177: '73', 207: '74', 205: '75', + 217: '76', 223: '77', 229: '78', 193: '79', 157: '80', 158: '81', 159: '82', 153: '83', 147: '84', 183: '85', 219: '86', 212: '87', + 16: '88', 233: '89', 235: '90', 237: '91', 239: '92', 241: '93', 244: '94', 247: '95', 250: '96', 254: '97', 231: '98', } + +__doc__ = '''########################################################################################################## +####################################################################################################################''' + +rgb2set = { "ef0": "#000000", "ef1": "#CD0000", "ef2": "#00CD00", "ef3": "#CDCD00", "ef4": "#0000EE", "ef5": "#CD00CD", "ef6": "#00CDCD", "ef7": "#E5E5E5", + "ef8": "#7F7F7F", "ef9": "#FF0000", "ef10": "#00FF00", "ef11": "#FFFF00", "ef12": "#5C5CFF", "ef13": "#FF00FF", "ef14": "#00FFFF", "ef15": "#FFFFFF", + "eb8": "#7F7F7F", "eb9": "#FF0000", "eb10": "#00FF00", "eb11": "#FFFF00", "eb12": "#5C5CFF", "eb13": "#FF00FF", "eb14": "#00FFFF", "eb15": "#FFFFFF", "ef16": "#000000", + "ef17": "#00005f", "ef18": "#000087", "ef19": "#0000af", "ef20": "#0000d7", "ef21": "#0000ff", "ef22": "#005f00", "ef23": "#005f5f", "ef24": "#005f87", "ef25": "#005faf", + "ef26": "#005fd7", "ef27": "#005fff", "ef28": "#008700", "ef29": "#00875f", "ef30": "#008787", "ef31": "#0087af", "ef32": "#0087d7", "ef33": "#0087ff", "ef34": "#00af00", + "ef35": "#00af5f", "ef36": "#00af87", "ef37": "#00afaf", "ef38": "#00afd7", "ef39": "#00afff", "ef40": "#00d700", "ef41": "#00d75f", "ef42": "#00d787", "ef43": "#00d7af", + "ef44": "#00d7d7", "ef45": "#00d7ff", "ef46": "#00ff00", "ef47": "#00ff5f", "ef48": "#00ff87", "ef49": "#00ffaf", "ef50": "#00ffd7", "ef51": "#00ffff", "ef52": "#5f0000", + "ef53": "#5f005f", "ef54": "#5f0087", "ef55": "#5f00af", "ef56": "#5f00d7", "ef57": "#5f00ff", "ef58": "#5f5f00", "ef59": "#5f5f5f", "ef60": "#5f5f87", "ef61": "#5f5faf", + "ef62": "#5f5fd7", "ef63": "#5f5fff", "ef64": "#5f8700", "ef65": "#5f875f", "ef66": "#5f8787", "ef67": "#5f87af", "ef68": "#5f87d7", "ef69": "#5f87ff", "ef70": "#5faf00", + "ef71": "#5faf5f", "ef72": "#5faf87", "ef73": "#5fafaf", "ef74": "#5fafd7", "ef75": "#5fafff", "ef76": "#5fd700", "ef77": "#5fd75f", "ef78": "#5fd787", "ef79": "#5fd7af", + "ef80": "#5fd7d7", "ef81": "#5fd7ff", "ef82": "#5fff00", "ef83": "#5fff5f", "ef84": "#5fff87", "ef85": "#5fffaf", "ef86": "#5fffd7", "ef87": "#5fffff", "ef88": "#870000", + "ef89": "#87005f", "ef90": "#870087", "ef91": "#8700af", "ef92": "#8700d7", "ef93": "#8700ff", "ef94": "#875f00", "ef95": "#875f5f", "ef96": "#875f87", "ef97": "#875faf", + "ef98": "#875fd7", "ef99": "#875fff", "ef100": "#878700", "ef101": "#87875f", "ef102": "#878787", "ef103": "#8787af", "ef104": "#8787d7", "ef105": "#8787ff", "ef106": "#87af00", + "ef107": "#87af5f", "ef108": "#87af87", "ef109": "#87afaf", "ef110": "#87afd7", "ef111": "#87afff", "ef112": "#87d700", "ef113": "#87d75f", "ef114": "#87d787", "ef115": "#87d7af", + "ef116": "#87d7d7", "ef117": "#87d7ff", "ef118": "#87ff00", "ef119": "#87ff5f", "ef120": "#87ff87", "ef121": "#87ffaf", "ef122": "#87ffd7", "ef123": "#87ffff", "ef124": "#af0000", + "ef125": "#af005f", "ef126": "#af0087", "ef127": "#af00af", "ef128": "#af00d7", "ef129": "#af00ff", "ef130": "#af5f00", "ef131": "#af5f5f", "ef132": "#af5f87", "ef133": "#af5faf", + "ef134": "#af5fd7", "ef135": "#af5fff", "ef136": "#af8700", "ef137": "#af875f", "ef138": "#af8787", "ef139": "#af87af", "ef140": "#af87d7", "ef141": "#af87ff", "ef142": "#afaf00", + "ef143": "#afaf5f", "ef144": "#afaf87", "ef145": "#afafaf", "ef146": "#afafd7", "ef147": "#afafff", "ef148": "#afd700", "ef149": "#afd75f", "ef150": "#afd787", "ef151": "#afd7af", + "ef152": "#afd7d7", "ef153": "#afd7ff", "ef154": "#afff00", "ef155": "#afff5f", "ef156": "#afff87", "ef157": "#afffaf", "ef158": "#afffd7", "ef159": "#afffff", "ef160": "#d70000", + "ef161": "#d7005f", "ef162": "#d70087", "ef163": "#d700af", "ef164": "#d700d7", "ef165": "#d700ff", "ef166": "#d75f00", "ef167": "#d75f5f", "ef168": "#d75f87", "ef169": "#d75faf", + "ef170": "#d75fd7", "ef171": "#d75fff", "ef172": "#d78700", "ef173": "#d7875f", "ef174": "#d78787", "ef175": "#d787af", "ef176": "#d787d7", "ef177": "#d787ff", "ef178": "#d7af00", + "ef179": "#d7af5f", "ef180": "#d7af87", "ef181": "#d7afaf", "ef182": "#d7afd7", "ef183": "#d7afff", "ef184": "#d7d700", "ef185": "#d7d75f", "ef186": "#d7d787", "ef187": "#d7d7af", + "ef188": "#d7d7d7", "ef189": "#d7d7ff", "ef190": "#d7ff00", "ef191": "#d7ff5f", "ef192": "#d7ff87", "ef193": "#d7ffaf", "ef194": "#d7ffd7", "ef195": "#d7ffff", "ef196": "#ff0000", + "ef197": "#ff005f", "ef198": "#ff0087", "ef199": "#ff00af", "ef200": "#ff00d7", "ef201": "#ff00ff", "ef202": "#ff5f00", "ef203": "#ff5f5f", "ef204": "#ff5f87", "ef205": "#ff5faf", + "ef206": "#ff5fd7", "ef207": "#ff5fff", "ef208": "#ff8700", "ef209": "#ff875f", "ef210": "#ff8787", "ef211": "#ff87af", "ef212": "#ff87d7", "ef213": "#ff87ff", "ef214": "#ffaf00", + "ef215": "#ffaf5f", "ef216": "#ffaf87", "ef217": "#ffafaf", "ef218": "#ffafd7", "ef219": "#ffafff", "ef220": "#ffd700", "ef221": "#ffd75f", "ef222": "#ffd787", "ef223": "#ffd7af", + "ef224": "#ffd7d7", "ef225": "#ffd7ff", "ef226": "#ffff00", "ef227": "#ffff5f", "ef228": "#ffff87", "ef229": "#ffffaf", "ef230": "#ffffd7", "ef231": "#ffffff", "ef232": "#080808", + "ef233": "#121212", "ef234": "#1c1c1c", "ef235": "#262626", "ef236": "#303030", "ef237": "#3a3a3a", "ef238": "#444444", "ef239": "#4e4e4e", "ef240": "#585858", "ef241": "#626262", + "ef242": "#6c6c6c", "ef243": "#767676", "ef244": "#808080", "ef245": "#8a8a8a", "ef246": "#949494", "ef247": "#9e9e9e", "ef248": "#a8a8a8", "ef249": "#b2b2b2", "ef250": "#bcbcbc", + "ef251": "#c6c6c6", "ef252": "#d0d0d0", "ef253": "#dadada", "ef254": "#e4e4e4", "ef255": "#eeeeee", } + +__doc__ = '''########################################################################################################## +####################################################################################################################''' + +set2rgb = { 52: '#470000', 94: '#472100', 100: '#474700', 58: '#324700', 22: '#004700', 29: '#00472C', 23: '#004747', 24: '#002747', 17: '#000047', 54: '#2E0047', 53: '#470047', 89: '#47002A', + 88: '#740000', 130: '#743A00', 142: '#747400', 64: '#517400', 28: '#007400', 35: '#007449', 30: '#007474', 25: '#004074', 18: '#000074', 91: '#4B0074', 90: '#740074', 125: '#740045', + 124: '#B50000', 166: '#B56300', 184: '#B5B500', 106: '#7DB500', 34: '#00B500', 49: '#00B571', 37: '#00B5B5', 33: '#0063B5', 19: '#0000B5', 129: '#7500B5', 127: '#B500B5', 161: '#B5006B', + 196: '#FF0000', 208: '#FF8C00', 226: '#FFFF00', 154: '#B2FF00', 46: '#00FF00', 86: '#00FFA0', 51: '#00FFFF', 75: '#008CFF', 21: '#0000FF', 171: '#A500FF', 201: '#FF00FF', 198: '#FF0098', + 203: '#FF5959', 215: '#FFB459', 227: '#FFFF71', 191: '#CFFF60', 83: '#6FFF6F', 122: '#65FFC9', 87: '#6DFFFF', 111: '#59B4FF', 63: '#5959FF', 177: '#C459FF', 207: '#FF66FF', 205: '#FF59BC', + 217: '#FF9C9C', 223: '#FFD39C', 229: '#FFFF9C', 193: '#E2FF9C', 157: '#9CFF9C', 158: '#9CFFDB', 159: '#9CFFFF', 153: '#9CD3FF', 147: '#9CD3FF', 183: '#DC9CFF', 219: '#FF9CFF', 212: '#FF94D3', + 16: '#000000', 233: '#131313', 235: '#282828', 237: '#363636', 239: '#4D4D4D', 241: '#656565', 244: '#818181', 247: '#9F9F9F', 250: '#BCBCBC', 254: '#E2E2E2', 231: '#FFFFFF', } + +__doc__ = '''########################################################################################################## +####################################################################################################################''' + +@irc3.plugin +class Plugin: + + __doc__ = ''' ##################################################################################################''' + + def __init__(self, bot): + __doc__ = ''' ##############################################################################################''' + + self.bot = bot + + __doc__ = ''' ##############################################################################################''' + + __doc__ = ''' ##################################################################################################''' + + def ratesex_request(self,site,commands): + USER_AGENT_BROWSER="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" + USER_AGENT_CURL="curl/7.29.0" + STATUS_BAD_CODE=":( - error code: {}" + STATUS_BAD_REASON=":( - failed reason: {}" + STATUS_OK=":)" + + if site != 'rate': + url = f"https://{site}.rate.sx/{commands}" + else: + url = f"https://rate.sx/{commands}" + r = Request(url,data=None,headers={ 'User-Agent': USER_AGENT_CURL }) + try: + response = urlopen(r,timeout=10).read().decode('utf-8') + except HTTPError as e: + return STATUS_BAD_CODE.format(e.code) + except URLError as e: + return STATUS_BAD_REASON.format(e.reason) + else: + return STATUS_OK + response + + __doc__ = ''' ##################################################################################################''' + + def escape_ansi(self,line): + ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]') + return ansi_escape.sub('', str(line)) + + __doc__ = ''' ##################################################################################################''' + + def invert_dict(self,d): + return {v: k for k, v in d.items()} + + __doc__ = ''' ##################################################################################################''' + + def enumerate_dict(self,d): + return list(zip(list(d),list(invert_dict(d)),range(len(d)))) + + __doc__ = ''' ##################################################################################################''' + + def organize_dict(self,d): + _d=list(d.values()) + return _d.sort() + + __doc__ = ''' ##################################################################################################''' + + def escape_ansi(self,line): + ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]') + return ansi_escape.sub('', str(line)) + + __doc__ = ''' ##################################################################################################''' + + def hex2gravity(self,h): + r,g,b=int(h[1:3],16),int(h[3:5],16),int(h[5:7],16) + o=list(set2rgb.values()); o.sort() + _R=[]; _G=[]; _B=[]; + + for _ in o: + R,G,B=(''.join([x for x in _[1:][:2]]).zfill(2)),(''.join([x for x in _[1:][2:4]]).zfill(2)),(''.join([x for x in _[1:][4:6]]).zfill(2)) + _R.append(int(R,16)); _G.append(int(G,16)); _B.append(int(B,16)); + + _r = [] + for _ in _R: + if r < _: + rsub = _ - r + else: + rsub = r - _ + _r.append(rsub) + + _g = [] + for _ in _G: + if g < _: + gsub = _ - g + else: + gsub = g - _ + _g.append(gsub) + + _b = [] + for _ in _B: + if b < _: + bsub = _ - b + else: + bsub = b - _ + _b.append(bsub) + rgb = [] + for _ in range(len(_r)): + rgb.append(_r[_]+_g[_]+_b[_]) + nearest_color_minus = min(rgb) + nearest_color_index = [i for i, x in enumerate(rgb) if x == nearest_color_minus] + nearest_color = o[nearest_color_index[0]] + return str(f"\x03{rgb2irc[self.invert_dict(set2rgb)[nearest_color]]}") + + __doc__ = ''' ##################################################################################################''' + + def parse_control(self,s): + px=[] + py=[] + _s=s + px=self.findall(_s,'\x1b') + for i,_ in enumerate(px): + py.append( _s.find('m',_)+1 ) + return px,py + + + __doc__ = ''' ##################################################################################################''' + + def findall(self,s,w): + return [i for i in range(len(s)) if s.startswith(w, i)] + + __doc__ = ''' ##################################################################################################''' + + def color_line(self,s,t): + codes=["\x1b[0m","\x1b[30m","\x1b[31m","\x1b[32m","\x1b[33m","\x1b[34m","\x1b[35m","\x1b[36m","\x1b[37m","\x1b[40m","\x1b[41m","\x1b[42m","\x1b[43m","\x1b[44m","\x1b[45m","\x1b[46m","\x1b[47m","\x1b(B","\x1b[m","\x1b[2m"] + colors=["\x0f","\x0301","\x0304","\x0303","\x0308","\x03002","\x0313","\x0311","\x0300","\x03,01","\x03,04","\x03,03","\x03,08","\x03,02","\x03,13","\x03,11","\x03,00","","\x0f",""] #f.write('\x0301,00decoded\n') + _s=s + p=[] + for _ in range(len(t[0])): + r=self.findall(s[t[0][_]:t[1][_]],'\x1b') + + for __ in range(len(r)): + if not __ == len(r)-1: + p.append(s[t[0][_]:t[1][_]][r[__]:r[__+1]]) + else: + check = s[t[0][_]:t[1][_]][r[__]:] + if check.find('mm') == -1: + p.append(check) + else: + p.append(check[:-1]) + for __ in p: + _s = _s.replace(__,"{}") + c=[] + for _ in p: + for i,__ in enumerate(codes): + if _ == __: + c.append(colors[i]) + if _.find('\x1b[38;5;') != -1: + gravity = _.replace('\x1b[38;5;','')[:-1] + farthest_color_hex = rgb2set['ef{}'.format(gravity)] + result = self.hex2gravity(farthest_color_hex) + c.append(result) + + r=self.findall(_s,'{}') + + for _ in range(len(r)): + _s=_s.replace('{}',c[_],1) + return _s + + __doc__ = ''' ##################################################################################################''' + + @command(permission='view') + def ratesex(self, mask, target, args): + """ratesex - help/commands: visit 'https://rate.sx/:help' or try '?ratesex rate :help', to check exchange rates for top 10 ^cripdoeocurrencies try '?ratesex rate top10.. sites added. rate,eur,btc,rub.. e.g. ?ratesex rate command, ?ratesex eur, ?ratesex btc, ?ratesex rub' + %%ratesex [] [] + """ + + site = args.get("") + command = args.get("") + + if command == "": + msg="error: no command issued.. ?ratesex rate, ?ratesex rate eth, ?ratesex rate :help, ?ratesex btc top10" + self.bot.privmsg(target, msg) + + sites=['rate','rub','eur','btc'] + FLAG=0 + for _ in sites: + if site == _: + FLAG=1 + if not FLAG==1: + msg="error: no site issued. sites: rate,rub,eur,btc. e.g. ?ratesex rate :help, ?ratesex btc top10, ?ratesex rub top10" + self.bot.privmsg(target, msg) + if command.lower() == 'top10': command = '' + response=self.ratesex_request(site,command) + s = '' + for _ in response: + s = s + ''.join(_) + r1=s[2:].splitlines() + for i in range(len(r1)-1): + d=self.parse_control(r1[i]) + r=self.color_line(r1[i],d) + if not r == '': + msg = r+'\n' + self.bot.privmsg(target, msg) + + __doc__ = ''' ##################################################################################################''' + + +__doc__ = ''':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. +/mMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNd- +-MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN` +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmNMMMMMMMMMMMmMMMMMMMMMMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh:NMMMMMMMMMMoyMMMMMMMMMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMm -NMMMMMMMMMs.NMMMMMMMMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy -hmmmmmNNm- sMMMMMMMMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmdyo+:` ```````.` .NMMMymMMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMmy+-.` -hNm-+MMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMms:` `.. /MMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMh/. /MMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMmMMMMMMMMMMMmhN:` /MMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMM+sNMMMMMMMMMN-h: `-+syyys/- -NMMMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMs +NMMMMMMMhm--d` :. -sdNMMMMMNNmy. :ydMMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMMMM+ :yhyyyhhso` os yhshNMMMMMMMh+:-:. :s- .NMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMMMMmho` ` `yo.h:sMMMMMMMMMMNd+. -NNs- yMMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMMMNh/. :++`-MMMMMMMMMMMMMm+` :ymds. -NMMMMMMMMMMMMMMMM- +/MMMMMMMMMMMmo- .MMMMMMMMMMMMMMMdo. `.-` yMMMMMMMMMMMMMMMM- +/MMMMMMMMMmo. `NMMMMMMMMMMMMMMMMNy/.` `mMMMMMMMMMMMMMMM- +/MMMMMMMNs. hMMMMMMMMMMMMMMMMMMMNho-` :NMMMMMMMMMMMMMM- +/MMMMMMm: ./syyyo- -hmNMMMMMMMMMMMMMMMMMMMMmho:.` /NMMMMMMMMMMMMM- +/MMMMMd. .smMMMNNNms` ` `+MMMMMMMMMMMMMMMMMMMMMMMMNdy/ `.yMMMMMMMMMMMMM- +/MMMMd. /mMMMMMy/:--` so. `mMMMMMMMMMMMMMMMMMMMMMMMNdo--:+sdNMMMMMMMMMMMMMM- +/MMMN- /NMMMMMMMMdo. oMm+. /MMMMMMMMMMMMMMMMdNMMMMMMNNNMMmMMMMMMMMMMMMMMMMM- +/MMMo -NMMMMMMMMMMdso-` /hmm+ sMMMMMMMMMMMMMMMs-mMMMMMMMMMM:dMMMMMMMMMMMMMMMM- +/MMN. sMMMMMMMMMMMo .os/.``.. `dMMMMMMMMMMMMMMs -NMMMMMMMMM-:MMMMMMMMMMMMMMMM- +/MMd mMMMMMMMMMMM/ `:os+-` .dMMMMMMMMMMMNm. -soosyhdms `mMMMMMMMMMMMMMMM- +/MMs mMMMMMMMMMMM: .hNhs/.` .dMMMMNmhs+:-` +MMMNoMMMMMMMMMM- +/MMy hMMMMMMMMMMM: oMMMMMNdyo/. .mNh+-` +mNy`mMMMMMMMMM- +/MMd +MMMMMMMMMMM/ :MMMMMMMMNs.`.:ohh/` ` mMMMMMMMMM- +/MMN. `mMMMMMMMMMMo `NMMMMMMNhhdNMMh: mMMMMMMMMM- +/MMM+ /MMMMMMMMMMh yMMMMMMMMMMMN+ `NMMMMMMMMM- +/MMMm` +MMMMMMMMMN` .NMMMMMMMMMN- :sdmNNNdy+` dMMMMMMMMM- +/MMMMo +MMMMMMMMM+ +MMMMMMMMM/ -dMMMMMMNmmNN/ .sdMMMMMMM- +/MMMMN: :mMMMMMMMm` oMMMMMMMh .mMMMMMMMms- `` /o` `mMMMMMM- +/MMMMMm. .yMMMMMMMo oMMMMMM/ sMMMMMMMMMMMh: :NNo. sMMMMMM- +/MMMMMMm. -hMMMMMN: /NMMMM. dMMMMMMMMMMMMMh- :hmNy` .NMMMMM- +/MMMMMMMm- -yNMMMm. .yMMM. dMMMMMMMMMMMMMMNh:` `..` yMMMMM- +/MMMMMMMMN+ .+hNMd. :hM: dMMMMMMMMMMMMMMMMNmo- .NMMMM- +/MMMMMMMMMMh- ./ss. `:: sMMMMMMMMMMMMMMMMMMMNms/. /MMMM- +/MMMMMMMMMMMNo. ` :MMMMMMMMMMMMMMMMMMMMMMMNdo:.` oMMM- +/MMMMMMMMMMMMMmo. `mMMMMMMMMMMMMMMMMMMMMMMMMMMNmh: .dMM- +/MMMMMMMMMMMMMMMNy:` +MMMMMMMMMMMMMMMMMMMMMMMMMMNh+::/+sdNMMM- +/MMMMMMMMMMMMMMMMMNdo- `dMMMMMMMMMMMMMMMMMMMMMMMMMNNNNNMMMMMMMM- +/MMMMMMMMMMMMMMMMMMMMNd+-` -NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM- +-NMMMMMMMMMMMMMMMMMMMMMMNdo:` /NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd` +-ymNNNNNNNNNNNNNNNNNNNNNNNNdo-` +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmy. + ............................ .-...............................` + `````` ````````` `````````````` `````````` ```''' \ No newline at end of file diff --git a/plugins/remind_plugin.py b/plugins/remind_plugin.py new file mode 100644 index 0000000..9535db8 --- /dev/null +++ b/plugins/remind_plugin.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +from irc3.plugins.cron import cron +import irc3 +from datetime import datetime +from time import time +import re +REMIND_RE = re.compile('maple.remind\s(.+?)\s(.+)') +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + def __triggered(i): + time_now = int(str(time()).split('.')[0]) + if i <= time_now: + print('triggered') + else: + print('not triggered') + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.PRIVMSG) + def on_privmsg_search_for_remind(self, mask=None, target=None, data=None, **kw): + match_list = REMIND_RE.findall(data) + if len(match_list) > 0: + stime = "" + trigger = "" + bhours = False + bminutes = False + tell_nick, message = match_list[0] + if tell_nick == 'me': tell_nick = mask.nick + if not message.split()[0].lower() == 'in': + irc_message = "TCPDIRECT/REMIND: reminding {} the format is maple remind ircnick in 2h15m to pet cat, or maple remind me in 1h to pet cat.".format(mask.nick) + self.bot.privmsg(target, self.bot.emo(irc_message)) + return + else: + message = message[3:] + trigger = message.split()[0] + message = message[len(trigger)+1:] + message_list = self.bot.db.getlist("remind_%s" % tell_nick.lower()) + ihours = 0 + iminutes = 0 + xpos = 0 + ypos = 0 + itrigger = 0 + epoch_time = int(str(time()).split('.')[0]) + stime = trigger + try: + if not stime.lower().find('h') == -1: + xpos = stime.lower().find('h')+1 + hours = int(stime[:stime.lower().find('h')]) + ihours = hours * (60*60) + if not stime.lower().find('m') == -1: + ypos = stime.lower().find('m') + minutes = int(stime[xpos:ypos]) + if minutes < 1: + irc_message = "TCPDIRECT/REMIND: reminding {} to quit wasting my time. format is maple remind ircnick in 2h15m to pet cat, or maple remind me in 1h to pet cat.".format(mask.nick) + self.bot.privmsg(target, self.bot.emo(irc_message)) + return + iminutes = minutes * 60 + except: + irc_message = "TCPDIRECT/REMIND: reminding {} to go and fuck themself err i mean, format is maple remind ircnick in 2h15m to pet cat, or maple remind me in 1h to pet cat.".format(mask.nick) + self.bot.privmsg(target, self.bot.emo(irc_message)) + return + epoch_trigger = epoch_time + ihours + iminutes + if epoch_trigger <= epoch_time: + irc_message = "TCPDIRECT/REMIND: reminding {} to quit wasting my time. format is maple remind ircnick in 2h15m to pet cat, or maple remind me in 1h to pet cat.".format(mask.nick) + self.bot.privmsg(target, self.bot.emo(irc_message)) + return + new_message = {"from": mask.nick.lower(), "target": target, "message": message, "time": datetime.now().isoformat(), "etime": epoch_time, "etrigger": epoch_trigger } + if not message_list: + message_list = self.bot.db.setlist("remind_%s" % tell_nick.lower(), [new_message]) + else: + message_list.append(new_message) + self.bot.db.setlist("remind_%s" % tell_nick.lower(), message_list) + irc_message = "TCPDIRECT/REMIND: {} < {} > reminding < {} > {}".format(new_message.get("time"),new_message.get("from"),tell_nick,new_message.get("message")) + self.bot.privmsg(target, self.bot.emo(irc_message)) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### +@cron('* * * * *') +def _reminding(bot): + nicks = ','.join(bot.db.context.nicks.keys()).split(',') + for _ in nicks: + if bot.db.getlist('remind_{}'.format(_)): + _keys = [] + for __ in bot.db.getlist('remind_{}'.format(_)): + etime = __['etime'] + etrigger = __['etrigger'] + _from = __['from'] + _target = __['target'] + _message = __['message'] + etime_now = int(str(time()).split('.')[0]) + if etime_now >= etrigger: + msg = "TCPDIRECT/REMIND: < {} > reminded < {} > - {}".format(_from,_,_message) + bot.privmsg(_target,msg) + else: + _keys.append(__) + bot.db.setlist("remind_{}".format(_),_keys) +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/sed_plugin.py b/plugins/sed_plugin.py new file mode 100644 index 0000000..6560f17 --- /dev/null +++ b/plugins/sed_plugin.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +import irc3 +import os +import random +from string import ascii_lowercase as alpha +SED1_RE = "juggle s/" +SED2_RE = "j/" +########################################################################################### +########################################################################################### +class TCPSED(): + buffer_text=[] + buffer_nick=[] + ####################################################################################### + ####################################################################################### + def __init__(self): + return + ####################################################################################### + ####################################################################################### + def push(self,data,nick): + self.buffer_text=self.buffer_text[-1:]+self.buffer_text[:-1] + self.buffer_text[0]=data + self.buffer_nick=self.buffer_nick[-1:]+self.buffer_nick[:-1] + self.buffer_nick[0]=nick + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.d=TCPSED() + for _ in range(2000): + self.d.buffer_text.append('') + self.d.buffer_nick.append('') + self.bot = bot + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.PRIVMSG) + def on_privmsg_search_for_sed(self, mask=None, target=None, data=None, **kw): + if self.bot.config.nick == mask.nick: + return + if mask.nick.lower() == 'nickserv': + return + flag=0 + offset = -1 + offset = data.find(SED1_RE) + if not offset == 0: + offset = data.find(SED2_RE) + if offset == 0: + flag=1 + if flag==0: + self.d.push(data,mask.nick) + return + _data=data.split('/') + _from='' + _to='' + _mode='' + try: + _from=_data[1] + _to=_data[2] + if len(_data) == 4: + if _data[3].lower() == 'g': _mode='g' + except Exception as e: + irc_message = f'TCPDIRECT/SED - Error: {e}' + self.bot.privmsg(target, self.bot.emo(irc_message)) + return + itwist=-1 + count=0 + for i,_ in enumerate(self.d.buffer_text): + if not _ == '': + itwist=i + count = len([_i for _i in range(len(_)) if _.startswith(_from, _i)]) + if count == 1: + self.d.buffer_text[i] = self.d.buffer_text[i].replace(_from,_to) + break + elif count > 1: + if _mode == 'g': + for y in range(count): + self.d.buffer_text[i] = self.d.buffer_text[i].replace(_from,_to) + break + else: + self.d.buffer_text[i] = self.d.buffer_text[i].replace(_from,_to,1) + break + if count != 0: + irc_message = "{}: {}".format(self.d.buffer_nick[itwist],self.d.buffer_text[itwist]) + else: + irc_message = f"TCPDIRECT/SED - Error: no result for: {data}" + self.bot.privmsg(target, self.bot.emo(irc_message)) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/seen_plugin.py b/plugins/seen_plugin.py new file mode 100644 index 0000000..5ac4e35 --- /dev/null +++ b/plugins/seen_plugin.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +from datetime import datetime +import operator +import irc3 +import timeago +import dateutil.parser +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + return + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.NEW_NICK) + def on_nick_change_for_seen(self, nick, new_nick): + new_key = "last_msg_for_{}".format(new_nick).lower() + msg_list = self.bot.db.getlist(new_key) + if not msg_list: + msg_list = [] + seen_msg = { "type": "newnick", + "time": datetime.now().isoformat(), + "msg": "{} changed nick to {}".format(nick.nick, new_nick)} + msg_list.append(seen_msg) + self.bot.db.setlist(new_key, msg_list) + return + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.PRIVMSG) + def on_privmsg_for_seen(self, mask=None, target=None, data=None, **kw): + if data.startswith("?"): return # no ? + if mask.lnick == self.bot.get_nick().lower(): return # Ignore ourseves + key = "last_msg_for_{}".format(mask.nick).lower() + priv_msg = { "type": "privmsg", + "time": datetime.now().isoformat(), + "msg": data } + messages = self.bot.db.getlist(key) + if not messages: + messages = [] + else: + for count, msg in enumerate(messages): + if msg.get("type") == "privmsg": + del(messages[count]) + messages.append(priv_msg) + self.bot.db.setlist(key, messages) + return + ####################################################################################### + ####################################################################################### + @command(permission='view') + def seen(self, mask, target, args): + """Display last time user was seen + %%seen + """ + nick = args.get("") + if nick.lower() == self.bot.get_nick().lower(): + msg = "please don't spy on me..." + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + key = "last_msg_for_{}".format(nick).lower() + message_list = self.bot.db.getlist(key) + if message_list: + message_list.sort(key=operator.itemgetter('time'), reverse=True) + nick_seen_set = set() + for msg in message_list: + if msg.get("type") == "newnick": + notice_msg = msg.get("msg").lower() + nick_to_remember = [ item.strip() for item in notice_msg.split("changed nick to")].pop() + if nick_to_remember in nick_seen_set: + continue + else: + nick_seen_set.add(nick_to_remember) + msg_time = dateutil.parser.parse(msg.get("time")) + time_since = timeago.format(msg_time, datetime.now()) + msg = "\x02{}\x0F \x0303▶\x0F \x02\x0302{}\x0F \x0306፨ \x0F\x1F\x1D{}\x0F".format(nick, msg.get("msg"), time_since.capitalize()) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + else: + msg = "{} Has Not Been Seen".format(nick) + msg = self.bot.emo(msg) + self.bot.privmsg(target, msg) + return + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/strain_plugin.py b/plugins/strain_plugin.py new file mode 100644 index 0000000..2da0cd1 --- /dev/null +++ b/plugins/strain_plugin.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +import irc3 +import requests +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + def _get_weed(self,t,s): + try: + url="" + if t == "search": + s = s.lower().replace(' ','-') + url = 'https://api.wikileaf.com/api/v7/search/all/?type=S&num=24&offset=0&sort=popular&query={}'.format(s) + if t == "review": + url = 'https://api.wikileaf.com/api/v6/reviews/?content_type__model=strain&object_id={}'.format(s) + r = requests.get(url) + try: + if r.json()['detail'] == 'Not found.': + return 'Not Found.' + except: + return r.json() + except: + return -1 + ####################################################################################### + ####################################################################################### + @command(permission='view') + def strain(self, mask, target, args): + """strain + %%strain ... + """ + try: + msg = ' '.join(args['']) + r_strain_id = -1 + r = self._get_weed('search',msg) + b = r['results'][0] + try: + r_name = b['name'] + r_score = b['score'] + r_review_avg = b['review_avg'] + r_review_count = b['review_count'] + r_type = b['type'] + r_compound_thc_min = b['compound']['THC']['min'] + r_compound_thc_max = b['compound']['THC']['max'] + r_compound_cbd_min = b['compound']['CBD']['min'] + r_compound_cbd_max = b['compound']['CBD']['max'] + r_consumption_time = b['consumption_time'] + r_uses = b['uses'] + r_effects = b['effects'] + r_logo_url = "https://assets.wikileaf.com/{}".format(b['logo_url']) + r_strain_id = b['strain_id'] + msg = "▶ name: {}".format(r_name) + msg = msg + " ▶ " + "score: {}".format(r_score) + msg = msg + " ▶ " + "review avg: {}".format(r_review_avg) + msg = msg + " ▶ " + "review count: {}".format(r_review_count) + msg = msg + " ▶ " + "type: {}".format(r_type) + msg = msg + " ▶ " + "compound thc min: {} / max: {}".format(r_compound_thc_min,r_compound_thc_max) + msg = msg + " ▶ " + "compound cbd min: {} / max: {}".format(r_compound_cbd_min,r_compound_cbd_max) + msg = msg + " ▶ " + "consumption time: {}".format(r_consumption_time) + msg = msg + " ▶ " + "uses: {}".format(r_uses) + msg = msg + " ▶ " + "effects: {}".format(r_effects) + msg = msg + " ▶ " + "logo: {}".format(r_logo_url) + self.bot.privmsg(target, msg) + except: + msg = "strain: not found" + self.bot.privmsg(target, msg) + try: + r = self._get_weed('review',r_strain_id) + b = r['results'] + for i,_ in enumerate(b): + msg = "▶▶ " + "review {} - rating: {} / comment: {}".format(i+1,_['rating'],_['comment']) + self.bot.privmsg(target, msg) + if i >= 2: break + url = b[0]['url'] + msg = "▶▶▶ " + "url: {}".format(url) + self.bot.privmsg(target, msg) + except: + pass + except: + msg = "strain: not found" + self.bot.privmsg(target, msg) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/tell_plugin.py b/plugins/tell_plugin.py new file mode 100644 index 0000000..ae4b1a5 --- /dev/null +++ b/plugins/tell_plugin.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +import irc3 +import re +TELL_RE = re.compile('maple.tell\s(.+?)\s(.+)') +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.PRIVMSG) + def on_privmsg_search_to_tell(self, mask=None, target=None, data=None, **kw): + if mask.nick.lower() == "maple": + return + messages_to_send = self.bot.db.getlist("tell_%s" % mask.nick.lower()) + if messages_to_send: + msg = messages_to_send[0] + irc_message = "TCPDIRECT/TOLD: {} <{}> told <{}> {}".format(msg.get("time"),msg.get("from"),mask.nick,msg.get("message")) + self.bot.privmsg(target, self.bot.emo(irc_message)) + self.bot.db.setlist("tell_%s" % mask.nick.lower(), messages_to_send[1:]) + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.PRIVMSG) + def on_privmsg_search_for_tell(self, mask=None, target=None, data=None, **kw): + match_list = TELL_RE.findall(data) + if len(match_list) > 0: + tell_nick, message = match_list[0] + if tell_nick == 'me' or tell_nick == 'us' or tell_nick == 'a' or tell_nick == 'some': return + message_list = self.bot.db.getlist("tell_%s" % tell_nick.lower()) + new_message = {"from": mask.nick.lower(), "message": message, "time": datetime.now().isoformat() } + if not message_list: + message_list = self.bot.db.setlist("tell_%s" % tell_nick.lower(), [new_message]) + else: + message_list.append(new_message) + self.bot.db.setlist("tell_%s" % tell_nick.lower(), message_list) + irc_message = "TCPDIRECT/TELL: {} <{}> telling <{}> {}".format(new_message.get("time"),new_message.get("from"),tell_nick,new_message.get("message")) + self.bot.privmsg(target, self.bot.emo(irc_message)) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/twitter_plugin.py b/plugins/twitter_plugin.py new file mode 100644 index 0000000..d01186a --- /dev/null +++ b/plugins/twitter_plugin.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +import irc3 +from datetime import datetime +import twitter +import re +import os +import time +import timeago +import os +import requests +from lxml.html import fromstring +from difflib import SequenceMatcher +########################################################################################### +########################################################################################### +CONSUMER_KEY = os.environ['CONSUMER_KEY'] +CONSUMER_SECRET = os.environ['CONSUMER_SECRET'] +ACCESS_TOKEN_KEY = os.environ['ACCESS_TOKEN_KEY'] +ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET'] +TOO_LONG = 2000 +YOUTUBE_REGEX = re.compile('http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?', re.IGNORECASE) +TWITTER_REGEX = re.compile('https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(es)?\/(\d+)$', re.IGNORECASE) +URL_REGEX = re.compile('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', re.IGNORECASE) +twitter = twitter.Api(consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET, + access_token_key=ACCESS_TOKEN_KEY, access_token_secret=ACCESS_TOKEN_SECRET) +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + @irc3.extend + def _similar(self, a, b): + return SequenceMatcher(None, a, b).ratio() + ####################################################################################### + ####################################################################################### + @irc3.extend + def _check_for_url(self, og_tweet, d_nick, d_url, d_unrolled, d_text, d_target): + match_list = URL_REGEX.findall(d_unrolled) + read_size = 0 + if match_list: + url = match_list.pop() + try: + if not d_unrolled.find('https://twitter.com/') == -1: + if not d_unrolled.find('status') == -1: + try: + e_status = d_unrolled.split('/')[-1] + e_tweet = twitter.GetStatus(e_status) + e_text = e_tweet.text + if self._similar(og_tweet.text,e_text) > 0.7: return + msg = "\x02\x0302{nick1:}:{nick2:}\x0F\x02\x0303 ▶▶ {e_text:} \x0F".format(nick1=d_nick,nick2='UNROLLED',e_text=e_text) + if e_tweet.media: + for y in range(len(e_tweet.media)): + m_turl = e_tweet.media[y].url + m_murl = e_tweet.media[y].media_url + m_eurl = e_tweet.media[y].expanded_url + msg = msg + " ▶▶ [media] \x0F\x02\x0312{media_url:}".format(media_url=m_murl) + if e_tweet.urls: + for y in range(len(e_tweet.urls)): + e_turl = e_tweet.urls[y].url + e_eurl = e_tweet.urls[y].expanded_url + msg = msg + " ▶▶ [url] \x0F\x02\x0312{e_url:}".format(e_url=e_eurl) + msg = self.bot._emoj(msg) + self.bot.privmsg(d_target, msg) + return + except Exception as e: + msg = "wu/tang >>>>>>>>>>> sub-unrolling: {}".format(e) + msg = self.bot._emoj(msg) + self.bot.privmsg(d_target, msg) + return + r = requests.get(d_unrolled, timeout=3, stream=True) + content_type = r.headers.get("Content-Type") + content_length = r.headers.get('Content-Length') + if not content_length: + content_length = 0 + if content_type.startswith('image'): + msg = "\x02\x0302{nick1:}:{nick2:}\x0F\x02\x0303 ▶▶ [media] {media:} \x0F".format(nick1=d_nick,nick2='UNROLLED',media=d_unrolled) + msg = self.bot._emoj(msg) + self.bot.privmsg(d_target, msg) + return + if not content_type.startswith("text/html"): + return + if int(content_length) > 200000: + self.bot.privmsg(d_target, "pre-fetch aborted -> fuck your large ass content -> {} -> {}".format(d_url,d_unrolled)) + while read_size <= (2000 * 10): + for content in r.iter_content(chunk_size=2000): + tree = fromstring(content) + title = tree.find(".//title") + if title is not None: + title = title.text.strip()[:100] + print('title: {}'.format(title)) + similarity = self.bot._similar(title,d_text) + if similarity > 0.4: + print('wu/tang: similarity') + return + msg = "\x02\x0302{nick1:}:{nick2:}\x0F\x02\x0304 ▶▶ \x0F\x1D\x0314{url:}\x0F\x0304 ▶▶ \x0F\x0303{unrolled:} \x0F\x0304▶▶ \x0F\x1D\x0314{title:}\x0F".format(nick1=d_nick,nick2='UNROLLED',url=d_url,unrolled=d_unrolled,title=title) + msg = self.bot._emoj(msg) + self.bot.privmsg(d_target, msg) + return + read_size = read_size + 2000 + except Exception as e: + self.bot.privmsg("_debug_check_for_url_error: {}".format(e)) + print("original: {} nick: {} url: {} unrolled: {} text: {} error: {}".format(og_tweet,d_nick,d_url,d_unrolled,d_text,e)) + pass + ####################################################################################### + ####################################################################################### + def _check_for_twitter(self, mask=None, data=None, target=None, **kw): + match_list = TWITTER_REGEX.findall(data) + if match_list: + status_id = match_list[0][2] + try: + tweet = twitter.GetStatus(status_id=status_id) + tweet_text = tweet.text + user = tweet.user.screen_name + fav_count = tweet.favorite_count + retweet_count = tweet.retweet_count + if tweet.coordinates: + location = tweet.coordinates + else: + location = "" + tweet_time = time.strptime(tweet.created_at, '%a %b %d %H:%M:%S +0000 %Y') + time_since = timeago.format(time.strftime('%Y-%m-%d %H:%M:%S', tweet_time), datetime.now()) + msg = "\x02\x0302{} \x0F\x0303▶\x0F \x02\x0301{}\x0F\x0314 | Retweets:\x0F \x1D\x0306{}\x0F\x0314 Favorites:\x0F\x1D\x0306 {} \x0F⑆\x1D\x0314\x1D {} {}".format(user, tweet_text, retweet_count, fav_count, time_since, location) + msg = self._emoj(msg) + self.bot.privmsg(target, msg) + match_list = URL_REGEX.findall(msg) + try: + if(match_list): + try: + if len(tweet.urls) == 0: + if tweet.media: + for y in range(len(tweet.media)): + m_turl = tweet.media[y].url + m_murl = tweet.media[y].media_url + m_eurl = tweet.media[y].expanded_url + msg = "\x02\x0302{nick1:}:{nick2:}\x0F\x02\x0304 ▶▶ [media] \x0F\x02\x0312{m_turl:}\x0F\x0304 ▶▶ \x0F\x0303{m_murl:} \x0F\x0304▶▶ \x0F\x1D\x0314{m_eurl:}\x0F".format(nick1=user,nick2='UNROLLED',m_turl=m_turl,m_murl=m_murl,m_eurl=m_eurl) + msg = self.bot._emoj(msg) + self.bot.privmsg(target, msg) + else: + for y in range(len(tweet.urls)): + t_turl = tweet.urls[y].url + try: + match_list.remove(t_turl) + except: + print('cant remove from matchlist, does not exist') + t_eurl = tweet.urls[y].expanded_url + yt_match_list = YOUTUBE_REGEX.findall(t_eurl) + if yt_match_list: + d_video_id = t_eurl.split('=')[1] + self.bot.madjust = "{}:UNROLLED".format(user) + self.bot.yt(mask,target,{'': [d_video_id],'yt': True}) + self.bot.madjust = "" + else: + if not str(tweet.id) == t_eurl.split('/')[-1]: + self.bot._check_for_url(tweet,user,t_turl,t_eurl,tweet_text,target) + else: + print('bypassing original tweet') + try: + if len(match_list) > 0: + print('items in matchlist remain') + print(match_list) + except: + print('errrororororororo: cant remove from matchlist, does not exist') + except Exception as e: + self.bot.privmsg(target,'twitter_plugin <> _debug_unrolling -> wu/tang: {}'.format(e)) + except Exception as e: + self.bot.privmsg(target,'twitter_plugin <> wu/tang: {}'.format(e)) + except Exception as e: + _msg = e.message[0]['message'] + _code = e.message[0]['code'] + _erid = '' + if _code == 179: + _erid = "PROTECTED TW33T" + else: + _erid = "DON'T CARE EXCEPTION" + msg = "\x02\x0302{} \x0F\x0304▶ \x0F\x02\x0312{} aka {}\x0F\x0303".format(_code,_msg,_erid) + msg = self._emoj(msg) + self.bot.privmsg(target, msg) + pass + ####################################################################################### + ####################################################################################### + @irc3.event(irc3.rfc.PRIVMSG) + def on_privmsg_search_for_twitter(self, mask=None, target=None, data=None, **kw): + if data.startswith("?"): return + if mask.nick.lower() not in self.bot.ignore_list: + self._check_for_twitter(mask, data, target) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/ud_plugin.py b/plugins/ud_plugin.py new file mode 100644 index 0000000..094caf9 --- /dev/null +++ b/plugins/ud_plugin.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from irc3.plugins.command import command +import irc3 +import requests +import urllib.parse +########################################################################################### +########################################################################################### +@irc3.plugin +class Plugin: + ####################################################################################### + ####################################################################################### + def __init__(self, bot): + self.bot = bot + ####################################################################################### + ####################################################################################### + @command(permission='view') + def ud(self, mask, target, args): + """Urban Dictonary A Term + %%ud ... + """ + term = ' '.join(args['']) + term = urllib.parse.quote(term) + r = requests.get('https://api.urbandictionary.com/v0/define?term={}'.format(term)) + d = r.json() + term = urllib.parse.unquote(term) + try: + msg = "{} - {} - example: {}".format(term, d.get("list")[0].get("definition"), d.get("list")[0].get("example")) + except: + msg = "{} Term Not Found".format(term) + self.bot.privmsg(target,msg) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/url_grabber_plugin.py b/plugins/url_grabber_plugin.py index d9be4ce..292c9cb 100644 --- a/plugins/url_grabber_plugin.py +++ b/plugins/url_grabber_plugin.py @@ -1,23 +1,22 @@ # -*- coding: utf-8 -*- import irc3 import re -import os import requests from lxml.html import fromstring - TOO_LONG = 2000 URL_REGEX = re.compile('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', re.IGNORECASE) YOUTUBE_REGEX = re.compile('http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?', re.IGNORECASE) TWITTER_REGEX = re.compile('https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(es)?\/(\d+)$', re.IGNORECASE) - -dir_path = os.path.dirname(os.path.realpath(__file__)) - +########################################################################################### +########################################################################################### @irc3.plugin class Plugin: - + ####################################################################################### + ####################################################################################### def __init__(self, bot): self.bot = bot - + ####################################################################################### + ####################################################################################### @irc3.event(irc3.rfc.PRIVMSG) def on_privmsg(self, mask=None, target=None, data=None, **kw): if not data.find('reacted with :') == -1: return @@ -25,7 +24,8 @@ class Plugin: if self.bot.check_if_ignored(mask): return if mask.nick == '[0]' or mask.nick == '[0]_': return self.__check_for_url(data, target, mask) - + ####################################################################################### + ####################################################################################### def __check_for_url(self, msg, target, mask): match_list = URL_REGEX.findall(msg) read_size = 0 @@ -36,21 +36,16 @@ class Plugin: msg = self.bot.emo(msg) self.bot.privmsg(target, msg) return - - # Ignore Youtube y_match = YOUTUBE_REGEX.findall(url) if y_match: y_match = y_match.pop() if len(y_match) == 3: return - - # Ignore Twitter t_match = TWITTER_REGEX.findall(url) if t_match: t_match = t_match.pop() if len(t_match) == 3: return - try: if not url.find("giphy.com") == -1: msg = "\x02\x0302{nick:}\x0F\x02\x0304 ▶ \x0F\x02\x0303{url:}\x0F\x0303".format(nick=mask.nick,url="fuk giphy!!!") @@ -67,11 +62,8 @@ class Plugin: content_length = r.headers.get('Content-Length') if not content_length: content_length = 0 - - # Ignore Large Content if int(content_length) > 200000: return - while read_size <= (2000 * 10): for content in r.iter_content(chunk_size=2000): tree = fromstring(content) @@ -85,4 +77,8 @@ class Plugin: read_size = read_size + 2000 except Exception as e: print("%s" % e) - pass \ No newline at end of file + pass + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/plugins/youtube_plugin.py b/plugins/youtube_plugin.py index 0532fd3..d5ca521 100644 --- a/plugins/youtube_plugin.py +++ b/plugins/youtube_plugin.py @@ -8,21 +8,23 @@ import dateutil.parser import timeago import isodate from apiclient.discovery import build - dir_path = os.path.dirname(os.path.realpath(__file__)) DEVELOPER_KEY = os.environ['DEVELOPER_KEY'] YOUTUBE_API_SERVICE_NAME = "youtube" YOUTUBE_API_VERSION = "v3" YOUTUBE_REGEX = re.compile('http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?', re.IGNORECASE) youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY) - +########################################################################################### +########################################################################################### @irc3.plugin class Plugin: - + ####################################################################################### + ####################################################################################### def __init__(self, bot): self.bot = bot self.bot.channel_live = [] - + ####################################################################################### + ####################################################################################### @irc3.extend def youtube_search(self, q=None, eventType=None, max_results=1, order="relevance", channelId=None, token=None, location=None, location_radius=None): search_response = youtube.search().list( @@ -40,13 +42,15 @@ class Plugin: for search_result in search_response.get("items", []): if search_result["id"]["kind"] == "youtube#video": return(search_result) - + ####################################################################################### + ####################################################################################### @irc3.event(irc3.rfc.PRIVMSG) def on_privmsg_search_for_youtube(self, mask=None, target=None, data=None, **kw): if data.startswith("?"): return if self.bot.check_if_ignored(mask): return self.__check_for_youtube(mask, data, target) - + ####################################################################################### + ####################################################################################### def __check_for_youtube(self, mask, msg, target): match_list = YOUTUBE_REGEX.findall(msg) if match_list: @@ -74,21 +78,24 @@ class Plugin: msg = msg msg = self.bot.emo(msg) self.bot.privmsg(target,msg) - + ####################################################################################### + ####################################################################################### @irc3.extend def videos_list_by_id(self, id): search_response = youtube.videos().list(part="id,snippet,statistics,topicDetails,contentDetails", id=id).execute() for search_result in search_response.get("items", []): if search_result["kind"] == "youtube#video": return(search_result) - + ####################################################################################### + ####################################################################################### @command(permission='view', public=True, show_in_help_list=True) def y(self, *args, **kwargs): """Search for youtube video %%y ... """ return self.yt(*args) - + ####################################################################################### + ####################################################################################### @irc3.extend @command(permission='view') def yt(self, mask, target, args): @@ -128,4 +135,8 @@ class Plugin: msg = msg + "\x0F\x02\x0312 ♫ \x0F\x02\x0313\x1D{topics:}\x0F\x02\x0312 ".format(topics=", ".join(topics)) msg = msg + url msg = self.bot.emo(msg) - self.bot.privmsg(target, msg) \ No newline at end of file + self.bot.privmsg(target, msg) + ####################################################################################### + ####################################################################################### +########################################################################################### +########################################################################################### \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 90e6d2b..1cf349f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ aiohttp asyncio async_timeout lxml +python-twitter imgaug==0.2.7 folium==0.2.1 numpy==1.19.2