Splitted up plugins, cosmetics for requires variables
This commit is contained in:
parent
b0f36a1924
commit
04601fdf39
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
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user