Splitted up plugins, cosmetics for requires variables
This commit is contained in:
		
							
								
								
									
										18
									
								
								config.json
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								config.json
									
									
									
									
									
								
							| @@ -10,23 +10,21 @@ | |||||||
|   "flood_rate": 4, |   "flood_rate": 4, | ||||||
|   "flood_rate_delay": 1, |   "flood_rate_delay": 1, | ||||||
|   "includes": [ |   "includes": [ | ||||||
|     "irc3.plugins.async", |  | ||||||
|     "irc3.plugins.cron", |  | ||||||
|     "irc3.plugins.command", |  | ||||||
|     "irc3.plugins.uptime", |     "irc3.plugins.uptime", | ||||||
|     "nxy.plugins.admin", |     "nxy.plugins.admin", | ||||||
|     "nxy.plugins.coins", |     "nxy.plugins.bitcoin", | ||||||
|     "nxy.plugins.ctcp", |     "nxy.plugins.ctcp", | ||||||
|     "nxy.plugins.database", |  | ||||||
|     "nxy.plugins.futures", |  | ||||||
|     "nxy.plugins.mcmaniac", |     "nxy.plugins.mcmaniac", | ||||||
|     "nxy.plugins.media", |     "nxy.plugins.youtube", | ||||||
|     "nxy.plugins.quotes", |     "nxy.plugins.quotes", | ||||||
|     "nxy.plugins.useless" |     "nxy.plugins.tell", | ||||||
|  |     "nxy.plugins.timer", | ||||||
|  |     "nxy.plugins.useless", | ||||||
|  |     "nxy.plugins.youtube" | ||||||
|   ], |   ], | ||||||
|   "irc3.plugins.command": { |   "irc3.plugins.command": { | ||||||
|     "cmd": ".", |     "guard": "irc3.plugins.command.mask_based_policy", | ||||||
|     "guard": "irc3.plugins.command.mask_based_policy" |     "cmd": "." | ||||||
|   }, |   }, | ||||||
|   "irc3.plugins.command.masks": { |   "irc3.plugins.command.masks": { | ||||||
|     "mrhanky!mrhanky@cocaine-import.agency": "all_permissions", |     "mrhanky!mrhanky@cocaine-import.agency": "all_permissions", | ||||||
|   | |||||||
| @@ -16,14 +16,14 @@ CFG_DEV = { | |||||||
|     'raw': True, |     'raw': True, | ||||||
|     'debug': True, |     'debug': True, | ||||||
|     'verbose': True, |     'verbose': True, | ||||||
|     "irc3.plugins.command.masks": { |     'irc3.plugins.command.masks': { | ||||||
|         "*!admin@127.0.0.1": "all_permissions", |         '*!admin@127.0.0.1': 'all_permissions', | ||||||
|         "*": "view" |         '*': 'view', | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| # TODO: imdb, youtube, pay, owe, rape (owe), ddg, regex, tell | # TODO: imdb, pay, owe, rape (owe), ddg, regex | ||||||
| def main(cfg_file): | def main(cfg_file): | ||||||
|     load_dotenv('.env') |     load_dotenv('.env') | ||||||
|     with open(cfg_file, 'r') as fp: |     with open(cfg_file, 'r') as fp: | ||||||
|   | |||||||
| @@ -12,10 +12,8 @@ from ..utils import fmt | |||||||
| 
 | 
 | ||||||
| # noinspection PyUnusedLocal | # noinspection PyUnusedLocal | ||||||
| @irc3.plugin | @irc3.plugin | ||||||
| class Coins(Plugin): | class Bitcoin(Plugin): | ||||||
|     requires = [ |     requires = ['irc3.plugins.command'] | ||||||
|         'irc3.plugins.command', |  | ||||||
|     ] |  | ||||||
| 
 | 
 | ||||||
|     @command |     @command | ||||||
|     def btc(self, mask: IrcString, channel: IrcString, args: DocOptDict): |     def btc(self, mask: IrcString, channel: IrcString, args: DocOptDict): | ||||||
| @@ -13,12 +13,10 @@ from ..utils import fmt | |||||||
| # noinspection PyUnusedLocal | # noinspection PyUnusedLocal | ||||||
| @irc3.plugin | @irc3.plugin | ||||||
| class CTCP(Plugin): | class CTCP(Plugin): | ||||||
|     TIMEOUT = 10 |     requires = ['irc3.plugins.async', | ||||||
|  |                 'irc3.plugins.command'] | ||||||
|  |  | ||||||
|     requires = [ |     TIMEOUT = 10 | ||||||
|         'irc3.plugins.async', |  | ||||||
|         'irc3.plugins.command', |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     async def ctcp(self, ctcp: str, mask: IrcString, args: DocOptDict): |     async def ctcp(self, ctcp: str, mask: IrcString, args: DocOptDict): | ||||||
|         nick = args.get('<nick>') or mask.nick |         nick = args.get('<nick>') or mask.nick | ||||||
|   | |||||||
| @@ -8,10 +8,8 @@ from ..utils import parse_int | |||||||
|  |  | ||||||
|  |  | ||||||
| class McManiac(DatabasePlugin): | class McManiac(DatabasePlugin): | ||||||
|     requires = [ |     requires = ['irc3.plugins.command', | ||||||
|         'irc3.plugins.command', |                 'nxy.plugins.database'] | ||||||
|         'nxy.plugins.database', |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     # noinspection PyUnusedLocal |     # noinspection PyUnusedLocal | ||||||
|     @command(options_first=True) |     @command(options_first=True) | ||||||
|   | |||||||
| @@ -1,63 +0,0 @@ | |||||||
| # -*- coding: utf-8 -*- |  | ||||||
| import irc3 |  | ||||||
| import os |  | ||||||
| import re |  | ||||||
| import requests |  | ||||||
|  |  | ||||||
| from irc3 import event, IrcBot |  | ||||||
|  |  | ||||||
| from . import Plugin |  | ||||||
| from ..utils import fmt, date_from_iso |  | ||||||
|  |  | ||||||
| YOUTUBE_URL = 'https://www.googleapis.com/youtube/v3' |  | ||||||
| YOUTUBE_API = '{}/videos?part=snippet,statistics,contentDetails' \ |  | ||||||
|     .format(YOUTUBE_URL) |  | ||||||
| YOUTUBE_SEARCH = '{}/search?part=id,snippet'.format(YOUTUBE_URL) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @irc3.plugin |  | ||||||
| class Media(Plugin): |  | ||||||
|     requires = [ |  | ||||||
|         'irc3.plugins.command', |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     def __init__(self, bot: IrcBot): |  | ||||||
|         super().__init__(bot) |  | ||||||
|         self.GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY'] |  | ||||||
|  |  | ||||||
|     @event(r'(?i)^:.* PRIVMSG (?P<target>.*) :.*(?:youtube.*?(?:v=|/v/)' |  | ||||||
|            r'|youtu\.be/)(?P<video_id>[-_a-zA-Z0-9]+).*') |  | ||||||
|     def youtube(self, target: str, video_id: str): |  | ||||||
|         req = requests.get(YOUTUBE_API, params={ |  | ||||||
|             'key': self.GOOGLE_API_KEY, |  | ||||||
|             'id': video_id}) |  | ||||||
|         data = req.json() |  | ||||||
|  |  | ||||||
|         if not data['items']: |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         item = data['items'][0] |  | ||||||
|         stats = item['statistics'] |  | ||||||
|         date = date_from_iso(item['snippet']['publishedAt']) |  | ||||||
|         length = item['contentDetails']['duration'] |  | ||||||
|         length = re.findall('(\d+[DHMS])', length) |  | ||||||
|         likes = int(stats.get('likeCount', 0)) |  | ||||||
|         dislikes = int(stats.get('dislikeCount', 0)) |  | ||||||
|  |  | ||||||
|         try: |  | ||||||
|             score = 100 * float(likes) / (likes + dislikes) |  | ||||||
|         except ZeroDivisionError: |  | ||||||
|             score = 0 |  | ||||||
|  |  | ||||||
|         res = fmt('{title} - length {length} -{color}{green} {likes:,}{reset} ' |  | ||||||
|                   '/{color}{maroon} {dislikes:,}{reset} ({score:,.1f}%) - ' |  | ||||||
|                   '{views:,} views - {channel} on {date}', |  | ||||||
|                   title=item['snippet']['localized']['title'], |  | ||||||
|                   channel=item['snippet']['channelTitle'], |  | ||||||
|                   length=' '.join([l.lower() for l in length]), |  | ||||||
|                   date=date.strftime('%Y.%m.%d'), |  | ||||||
|                   views=int(stats.get('viewCount', 0)), |  | ||||||
|                   likes=likes, |  | ||||||
|                   dislikes=dislikes, |  | ||||||
|                   score=score) |  | ||||||
|         self.bot.privmsg(target, res) |  | ||||||
| @@ -12,10 +12,8 @@ from ..utils import parse_int | |||||||
|  |  | ||||||
| @irc3.plugin | @irc3.plugin | ||||||
| class Quotes(DatabasePlugin): | class Quotes(DatabasePlugin): | ||||||
|     requires = [ |     requires = ['irc3.plugins.command', | ||||||
|         'irc3.plugins.command', |                 'nxy.plugins.database'] | ||||||
|         'nxy.plugins.database', |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     NICK_REGEX = re.compile(r'<?[~&@%+]?([a-zA-Z0-9_\-^`|\\\[\]{}]+)>?') |     NICK_REGEX = re.compile(r'<?[~&@%+]?([a-zA-Z0-9_\-^`|\\\[\]{}]+)>?') | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										53
									
								
								nxy/plugins/tell.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								nxy/plugins/tell.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from docopt import Dict as DocOptDict | ||||||
|  | from irc3.plugins.command import command | ||||||
|  | from irc3.utils import IrcString | ||||||
|  | from irc3 import IrcBot, event | ||||||
|  | import irc3 | ||||||
|  |  | ||||||
|  | from . import DatabasePlugin | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @irc3.plugin | ||||||
|  | class Tell(DatabasePlugin): | ||||||
|  |     requires = ['irc3.plugins.command', | ||||||
|  |                 'nxy.plugins.database'] | ||||||
|  |  | ||||||
|  |     def __init__(self, bot: IrcBot): | ||||||
|  |         super().__init__(bot) | ||||||
|  |         self.tell_queue = {} | ||||||
|  |         # Restore tells from database | ||||||
|  |         self.cur.execute('select from_user, to_user, message from tells') | ||||||
|  |         for res in self.cur.fetchall(): | ||||||
|  |             user = res['to_user'] | ||||||
|  |             if user not in self.tell_queue: | ||||||
|  |                 self.tell_queue[user] = [] | ||||||
|  |             self.tell_queue[user].append(res) | ||||||
|  |  | ||||||
|  |     # noinspection PyUnusedLocal | ||||||
|  |     @command | ||||||
|  |     def tell(self, mask: IrcString, channel: IrcString, args: DocOptDict): | ||||||
|  |         """Saves a message for nick to forward on activity | ||||||
|  |  | ||||||
|  |         %%tell <nick> <message>... | ||||||
|  |         """ | ||||||
|  |         nick = args['<nick>'].lower() | ||||||
|  |         if nick not in self.tell_queue: | ||||||
|  |             self.tell_queue[nick] = [] | ||||||
|  |         tell = [mask.nick.lower(), nick, ' '.join(args['<message>'])] | ||||||
|  |         self.tell_queue[nick].append(tell) | ||||||
|  |         self.cur.execute('insert into tells (from_user, to_user, message)' | ||||||
|  |                          'values (?, ?, ?)', tell) | ||||||
|  |         self.con.commit() | ||||||
|  |  | ||||||
|  |     @event(r'(?i)^:(?P<mask>.*) PRIVMSG .* :.*') | ||||||
|  |     def check(self, mask: str): | ||||||
|  |         """If activ user has tells, forward and delete them.""" | ||||||
|  |         nick = IrcString(mask).nick | ||||||
|  |         if nick in self.tell_queue: | ||||||
|  |             for tell in self.tell_queue[nick]: | ||||||
|  |                 self.bot.privmsg(nick, '[Tell] Message from {nick}: {message}' | ||||||
|  |                                  .format(nick=tell[0], message=tell[2])) | ||||||
|  |             del self.tell_queue[nick] | ||||||
|  |             self.cur.execute('delete from tells where to_user = ?', [nick]) | ||||||
|  |             self.con.commit() | ||||||
| @@ -5,7 +5,6 @@ import asyncio | |||||||
| from docopt import Dict as DocOptDict | from docopt import Dict as DocOptDict | ||||||
| from irc3.plugins.command import command | from irc3.plugins.command import command | ||||||
| from irc3.utils import IrcString | from irc3.utils import IrcString | ||||||
| from irc3 import IrcBot, event |  | ||||||
| import irc3 | import irc3 | ||||||
| 
 | 
 | ||||||
| from . import DatabasePlugin | from . import DatabasePlugin | ||||||
| @@ -13,15 +12,12 @@ from ..utils import fmt, time_delta | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @irc3.plugin | @irc3.plugin | ||||||
| class Futures(DatabasePlugin): | class Timer(DatabasePlugin): | ||||||
|     requires = [ |     requires = ['irc3.plugins.command', | ||||||
|         'irc3.plugins.command', |                 'nxy.plugins.database'] | ||||||
|         'nxy.plugins.database', |  | ||||||
|     ] |  | ||||||
| 
 | 
 | ||||||
|     def __init__(self, bot: IrcBot): |     def __init__(self, bot: irc3.IrcBot): | ||||||
|         super().__init__(bot) |         super().__init__(bot) | ||||||
|         self.tell_queue = {} |  | ||||||
|         # Restore timers from database |         # Restore timers from database | ||||||
|         self.cur.execute('select id, mask, channel, message, delay, until ' |         self.cur.execute('select id, mask, channel, message, delay, until ' | ||||||
|                          'from timers') |                          'from timers') | ||||||
| @@ -30,26 +26,6 @@ class Futures(DatabasePlugin): | |||||||
|             args = (IrcString(res['mask']), res['channel'], delta, |             args = (IrcString(res['mask']), res['channel'], delta, | ||||||
|                     res['message'], res['delay'], res['id']) |                     res['message'], res['delay'], res['id']) | ||||||
|             asyncio.ensure_future(self._timer(*args)) |             asyncio.ensure_future(self._timer(*args)) | ||||||
|         # Restore tells from database |  | ||||||
|         self.cur.execute('select mask, user, message from tells') |  | ||||||
|         for res in self.cur.fetchall(): |  | ||||||
|             user = res['user'] |  | ||||||
|             if user not in self.tell_queue: |  | ||||||
|                 self.tell_queue[user] = [] |  | ||||||
|             self.tell_queue[user].append(res) |  | ||||||
| 
 |  | ||||||
|     @event(r'(?i)^:(?P<mask>.*) PRIVMSG .* :.*') |  | ||||||
|     def tell_check(self, mask: str): |  | ||||||
|         """If activ user has tells, forward and delete them.""" |  | ||||||
|         nick = IrcString(mask).nick |  | ||||||
|         if nick in self.tell_queue: |  | ||||||
|             for tell in self.tell_queue[nick]: |  | ||||||
|                 self.bot.privmsg(nick, '[Tell] Message from {nick}: {message}' |  | ||||||
|                                  .format(nick=IrcString(tell['mask']).nick, |  | ||||||
|                                          message=tell['message'])) |  | ||||||
|             del self.tell_queue[nick] |  | ||||||
|             self.cur.execute('delete from tells where user = ?', [nick]) |  | ||||||
|             self.con.commit() |  | ||||||
| 
 | 
 | ||||||
|     @command |     @command | ||||||
|     def timer(self, mask: IrcString, channel: IrcString, args: DocOptDict): |     def timer(self, mask: IrcString, channel: IrcString, args: DocOptDict): | ||||||
| @@ -73,26 +49,6 @@ class Futures(DatabasePlugin): | |||||||
|         else: |         else: | ||||||
|             self.bot.privmsg(channel, 'Invalid timer delay') |             self.bot.privmsg(channel, 'Invalid timer delay') | ||||||
| 
 | 
 | ||||||
|     # noinspection PyUnusedLocal |  | ||||||
|     @command |  | ||||||
|     def tell(self, mask: IrcString, channel: IrcString, args: DocOptDict): |  | ||||||
|         """Saves a message for nick to forward on activity |  | ||||||
| 
 |  | ||||||
|         %%tell <nick> <message>... |  | ||||||
|         """ |  | ||||||
|         nick = args['<nick>'] |  | ||||||
|         message = ' '.join(args['<message>']) |  | ||||||
|         if nick not in self.tell_queue: |  | ||||||
|             self.tell_queue[nick] = [] |  | ||||||
|         self.tell_queue[nick].append({ |  | ||||||
|             'mask': mask, |  | ||||||
|             'user': nick, |  | ||||||
|             'message': message, |  | ||||||
|         }) |  | ||||||
|         self.cur.execute('insert into tells (mask, user, message) values ' |  | ||||||
|                          '(?, ?, ?)', [mask, nick, message]) |  | ||||||
|         self.con.commit() |  | ||||||
| 
 |  | ||||||
|     async def _timer(self, mask: IrcString, channel: IrcString, |     async def _timer(self, mask: IrcString, channel: IrcString, | ||||||
|                      delta: timedelta, message: str, delay: str, row_id: int): |                      delta: timedelta, message: str, delay: str, row_id: int): | ||||||
|         """Async function, sleeps for `delay` seconds and sends notification""" |         """Async function, sleeps for `delay` seconds and sends notification""" | ||||||
| @@ -25,9 +25,7 @@ GNU_LINUX = """I'd Just Like To Interject For A Moment. What you're referring | |||||||
| # noinspection PyUnusedLocal | # noinspection PyUnusedLocal | ||||||
| @irc3.plugin | @irc3.plugin | ||||||
| class Useless(Plugin): | class Useless(Plugin): | ||||||
|     requires = [ |     requires = ['irc3.plugins.command'] | ||||||
|         'irc3.plugins.command', |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     @event(r'(?i)^:.* PRIVMSG (?P<channel>.*) :' |     @event(r'(?i)^:.* PRIVMSG (?P<channel>.*) :' | ||||||
|            r'.*(?<!gnu[/+])linux(?! kernel).*') |            r'.*(?<!gnu[/+])linux(?! kernel).*') | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								nxy/plugins/youtube.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								nxy/plugins/youtube.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | import irc3 | ||||||
|  | import os | ||||||
|  | import re | ||||||
|  | import requests | ||||||
|  |  | ||||||
|  | from irc3 import event, IrcBot | ||||||
|  |  | ||||||
|  | from . import Plugin | ||||||
|  | from ..utils import fmt, date_from_iso | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @irc3.plugin | ||||||
|  | class YouTube(Plugin): | ||||||
|  |     requires = ['irc3.plugins.command'] | ||||||
|  |  | ||||||
|  |     URL = 'https://www.googleapis.com/youtube/v3' | ||||||
|  |     API = '{}/videos?part=snippet,statistics,contentDetails'.format(URL) | ||||||
|  |     SEARCH = '{}/search?part=id,snippet'.format(URL) | ||||||
|  |  | ||||||
|  |     def __init__(self, bot: IrcBot): | ||||||
|  |         super().__init__(bot) | ||||||
|  |         self.GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY'] | ||||||
|  |  | ||||||
|  |     @event(r'(?i)^:.* PRIVMSG (?P<target>.*) :.*(?:youtube.*?(?:v=|/v/)' | ||||||
|  |            r'|youtu\.be/)(?P<video_id>[-_a-zA-Z0-9]+).*') | ||||||
|  |     def youtube_parser(self, target: str, video_id: str): | ||||||
|  |         req = requests.get(self.API, params={ | ||||||
|  |             'key': self.GOOGLE_API_KEY, | ||||||
|  |             'id': video_id}) | ||||||
|  |         data = req.json() | ||||||
|  |  | ||||||
|  |         if not data['items']: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         item = data['items'][0] | ||||||
|  |         date = date_from_iso(item['snippet']['publishedAt']) | ||||||
|  |         length = item['contentDetails']['duration'] | ||||||
|  |         length = re.findall('(\d+[DHMS])', length) | ||||||
|  |         likes = int(item['statistics'].get('likeCount', 0)) | ||||||
|  |         dislikes = int(item['statistics'].get('dislikeCount', 0)) | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             score = 100 * float(likes) / (likes + dislikes) | ||||||
|  |         except ZeroDivisionError: | ||||||
|  |             score = 0 | ||||||
|  |  | ||||||
|  |         text = fmt('{title} - length {length} -{color}{green} {likes:,}{reset}' | ||||||
|  |                    ' /{color}{maroon} {dislikes:,}{reset} ({score:,.1f}%) - ' | ||||||
|  |                    '{views:,} views - {channel} on {date}', | ||||||
|  |                    title=item['snippet']['localized']['title'], | ||||||
|  |                    channel=item['snippet']['channelTitle'], | ||||||
|  |                    length=' '.join([l.lower() for l in length]), | ||||||
|  |                    date=date.strftime('%Y.%m.%d'), | ||||||
|  |                    views=int(item['statistics'].get('viewCount', 0)), | ||||||
|  |                    likes=likes, | ||||||
|  |                    dislikes=dislikes, | ||||||
|  |                    score=score) | ||||||
|  |         self.bot.privmsg(target, text) | ||||||
							
								
								
									
										1
									
								
								repl.py
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								repl.py
									
									
									
									
									
								
							| @@ -5,7 +5,6 @@ import os | |||||||
| import re | import re | ||||||
|  |  | ||||||
| from pprint import pprint | from pprint import pprint | ||||||
| # noinspection PyPackageRequirements |  | ||||||
| from dotenv import load_dotenv | from dotenv import load_dotenv | ||||||
|  |  | ||||||
| pp = pprint | pp = pprint | ||||||
|   | |||||||
| @@ -23,8 +23,8 @@ create table if not exists timers ( | |||||||
|  |  | ||||||
| create table if not exists tells ( | create table if not exists tells ( | ||||||
|     id integer primary key autoincrement, |     id integer primary key autoincrement, | ||||||
|     mask text not null, |     from_user text not null, | ||||||
|     user text not null, |     to_user text not null, | ||||||
|     message text not null, |     message text not null, | ||||||
|     created timestamp not null default current_timestamp |     created timestamp not null default current_timestamp | ||||||
| ); | ); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user