Merge branch 'master' of https://github.com/Phxntxm/Bonfire
This commit is contained in:
commit
276d35213f
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -10,3 +10,4 @@ autoupdate.php
|
|||
error_log
|
||||
images/*
|
||||
.ftpquota
|
||||
bonfire.log
|
||||
|
|
5
bot.py
5
bot.py
|
@ -5,6 +5,8 @@ import traceback
|
|||
import logging
|
||||
import datetime
|
||||
import pendulum
|
||||
import os
|
||||
|
||||
from discord.ext import commands
|
||||
from cogs.utils import config
|
||||
|
||||
|
@ -25,6 +27,7 @@ extensions = ['cogs.interaction',
|
|||
bot = commands.Bot(command_prefix=config.commandPrefix, description=config.botDescription, pm_help=None)
|
||||
discord_logger = logging.getLogger('discord')
|
||||
discord_logger.setLevel(logging.WARNING)
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
log = logging.getLogger()
|
||||
log.setLevel(logging.INFO)
|
||||
|
@ -101,7 +104,7 @@ async def on_command_error(error, ctx):
|
|||
await bot.send_message(ctx.message.channel, error)
|
||||
elif not isinstance(error, commands.CommandNotFound):
|
||||
now = datetime.datetime.now()
|
||||
with open("{}/error_log".format(config.base_path), 'a') as f:
|
||||
with open("error_log", 'a') as f:
|
||||
print("In server '{0.message.server}' at {1}\nFull command: `{0.message.content}`".format(ctx, str(now)),
|
||||
file=f)
|
||||
try:
|
||||
|
|
|
@ -77,8 +77,7 @@ class Core:
|
|||
async def doggo(self, ctx):
|
||||
"""Use this to print a random doggo image.
|
||||
Doggo is love, doggo is life."""
|
||||
os.chdir('/home/phxntx5/public_html/Bonfire/images')
|
||||
f = glob.glob('doggo*')[random.randint(0, len(glob.glob('doggo*')) - 1)]
|
||||
f = glob.glob('images/doggo*')[random.randint(0, len(glob.glob('doggo*')) - 1)]
|
||||
with open(f, 'rb') as f:
|
||||
await self.bot.upload(f)
|
||||
|
||||
|
@ -87,8 +86,7 @@ class Core:
|
|||
async def snek(self, ctx):
|
||||
"""Use this to print a random snek image.
|
||||
Sneks are o3o"""
|
||||
os.chdir('/home/phxntx5/public_html/Bonfire/images')
|
||||
f = glob.glob('snek*')[random.randint(0, len(glob.glob('snek*')) - 1)]
|
||||
f = glob.glob('images/snek*')[random.randint(0, len(glob.glob('snek*')) - 1)]
|
||||
with open(f, 'rb') as f:
|
||||
await self.bot.upload(f)
|
||||
|
||||
|
|
13
cogs/mod.py
13
cogs/mod.py
|
@ -12,6 +12,17 @@ class Mod:
|
|||
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
|
||||
@commands.command(pass_context=True, no_pm=True)
|
||||
@checks.customPermsOrRole(kick_members=True)
|
||||
async def alerts(self, ctx, channel: discord.Channel):
|
||||
"""This command is used to set a channel as the server's 'notifications' channel
|
||||
Any notifications (like someone going live on Twitch, or Picarto) will go to that channel"""
|
||||
server_alerts = config.getContent('server_alerts') or {}
|
||||
server_alerts[ctx.message.server.id] = channel.id
|
||||
await self.bot.say("I have just changed this server's 'notifications' channel"
|
||||
"\nAll notifications will now go to `{}`".format(channel))
|
||||
|
||||
@commands.command(pass_context=True, no_pm=True)
|
||||
@checks.customPermsOrRole(kick_members=True)
|
||||
async def usernotify(self, ctx, on_off:str):
|
||||
|
@ -22,7 +33,7 @@ class Mod:
|
|||
notifications = config.getContent('user_notifications') or {}
|
||||
notifications[ctx.message.server.id] = on_off
|
||||
config.saveContent('user_notifications',notifications)
|
||||
fmt = "notify, in this channel" if on_off else "not notify"
|
||||
fmt = "notify" if on_off else "not notify"
|
||||
await self.bot.say("This server will now {} if someone has joined or left".format(fmt))
|
||||
|
||||
@commands.group(pass_context=True, no_pm=True)
|
||||
|
|
|
@ -32,8 +32,7 @@ class Owner:
|
|||
@commands.check(checks.isOwner)
|
||||
async def adddoggo(self, url: str):
|
||||
"""Saves a URL as an image to add for the doggo command"""
|
||||
os.chdir('{}/images'.format(config.base_path))
|
||||
local_path = 'doggo{}.jpg'.format(len(glob.glob('doggo*')))
|
||||
local_path = 'images/doggo{}.jpg'.format(len(glob.glob('doggo*')))
|
||||
with aiohttp.ClientSession() as s:
|
||||
async with s.get(url) as r:
|
||||
val = await r.read()
|
||||
|
@ -46,8 +45,7 @@ class Owner:
|
|||
@commands.check(checks.isOwner)
|
||||
async def addsnek(self, url: str):
|
||||
"""Saves a URL as an image to add for the snek command"""
|
||||
os.chdir('{}/images'.format(config.base_path))
|
||||
local_path = 'snek{}.jpg'.format(len(glob.glob('snek*')))
|
||||
local_path = 'images/snek{}.jpg'.format(len(glob.glob('snek*')))
|
||||
with aiohttp.ClientSession() as s:
|
||||
async with s.get(url) as r:
|
||||
val = await r.read()
|
||||
|
@ -90,7 +88,7 @@ class Owner:
|
|||
@commands.check(checks.isOwner)
|
||||
async def avatar(self, content: str):
|
||||
"""Changes the avatar for the bot to the filename following the command"""
|
||||
file = '{}/images/{}'.format(config.base_path, content)
|
||||
file = 'images/' + content
|
||||
with open(file, 'rb') as fp:
|
||||
await self.bot.edit_profile(avatar=fp.read())
|
||||
|
||||
|
|
|
@ -14,16 +14,19 @@ base_url = 'https://ptvappapi.picarto.tv'
|
|||
key = '03e26294-b793-11e5-9a41-005056984bd4'
|
||||
|
||||
|
||||
async def check_online(stream):
|
||||
async def online_users():
|
||||
try:
|
||||
url = '{}/channel/{}?key={}'.format(base_url, stream, key)
|
||||
url = '{}/online/all?key={}'.format(base_url, key)
|
||||
with aiohttp.ClientSession(headers={"User-Agent": "Bonfire/1.0.0"}) as s:
|
||||
async with s.get(url) as r:
|
||||
response = await r.text()
|
||||
return json.loads(response).get('is_online')
|
||||
return json.loads(response)
|
||||
except:
|
||||
return False
|
||||
return {}
|
||||
|
||||
def check_online(online_channels, channel):
|
||||
matches = [stream for stream in online_channels if stream['channel_name'].lower() == channel.lower()]
|
||||
return len(matches) > 0
|
||||
|
||||
class Picarto:
|
||||
def __init__(self, bot):
|
||||
|
@ -33,16 +36,19 @@ class Picarto:
|
|||
await self.bot.wait_until_ready()
|
||||
while not self.bot.is_closed:
|
||||
picarto = config.getContent('picarto') or {}
|
||||
online_users = await online_users()
|
||||
for m_id, r in picarto.items():
|
||||
url = r['picarto_url']
|
||||
live = r['live']
|
||||
notify = r['notifications_on']
|
||||
user = re.search("(?<=picarto.tv/)(.*)", url).group(1)
|
||||
online = await check_online(user)
|
||||
online = check_online(online_users, user)
|
||||
|
||||
if not live and notify and online:
|
||||
for server_id, channel_id in r['servers'].items():
|
||||
for server_id in r['servers'].items():
|
||||
server = self.bot.get_server(server_id)
|
||||
server_alerts = config.getContent('server_alerts') or {}
|
||||
channel_id = server_alerts.get(server_id) or server_id
|
||||
channel = self.bot.get_channel(channel_id)
|
||||
member = discord.utils.find(lambda m: m.id == m_id, server.members)
|
||||
|
||||
|
@ -53,6 +59,8 @@ class Picarto:
|
|||
elif live and not online:
|
||||
for server_id, channel_id in r['servers'].items():
|
||||
server = self.bot.get_server(server_id)
|
||||
server_alerts = config.getContent('server_alerts') or {}
|
||||
channel_id = server_alerts.get(server_id) or server_id
|
||||
channel = self.bot.get_channel(channel_id)
|
||||
member = discord.utils.find(lambda m: m.id == m_id, server.members)
|
||||
|
||||
|
|
|
@ -3,40 +3,52 @@ import asyncio
|
|||
import json
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
base_path = "/home/phxntx5/public_html/Bonfire"
|
||||
with open("{}/config.yml".format(base_path), "r") as f:
|
||||
global_config = yaml.load(f)
|
||||
|
||||
connection = None
|
||||
try:
|
||||
with open("config.yml", "r") as f:
|
||||
global_config = yaml.load(f)
|
||||
except FileNotFoundError:
|
||||
print("You have no config file setup! Please use config.yml.sample to setup a valid config file")
|
||||
quit()
|
||||
|
||||
botDescription = global_config.get("description")
|
||||
commandPrefix = global_config.get("command_prefix", "!")
|
||||
discord_bots_key = global_config.get('discord_bots_key')
|
||||
discord_bots_key = global_config.get('discord_bots_key', "")
|
||||
|
||||
battleWins = global_config.get("battleWins", [])
|
||||
defaultStatus = global_config.get("default_status", "")
|
||||
botToken = global_config.get("bot_token", "")
|
||||
owner_ids = global_config.get("owner_id", [])
|
||||
try:
|
||||
botToken = global_config["bot_token"]
|
||||
except KeyError:
|
||||
print("You have no bot_token saved, this is a requirement for running a bot.")
|
||||
print("Please use config.yml.sample to setup a valid config file")
|
||||
quit()
|
||||
|
||||
try:
|
||||
owner_ids = global_config["owner_id"]
|
||||
except KeyError:
|
||||
print("You have no owner_id saved! You're not going to be able to run certain commands without this.")
|
||||
print("Please use config.yml.sample to setup a valid config file")
|
||||
quit()
|
||||
|
||||
|
||||
def saveContent(key: str, content):
|
||||
with open("{}/config.json".format(base_path), "r+") as jf:
|
||||
data = json.load(jf)
|
||||
jf.seek(0)
|
||||
data[key] = content
|
||||
with open("config.json", "a+") as jf:
|
||||
try:
|
||||
json.dumps(data)
|
||||
except:
|
||||
return False
|
||||
else:
|
||||
jf.truncate()
|
||||
json.dump(data, jf, indent=4)
|
||||
return True
|
||||
data = json.load(jf)
|
||||
except json.JSONDecodeError:
|
||||
data = {}
|
||||
data[key] = content
|
||||
jf.seek(0)
|
||||
jf.truncate()
|
||||
json.dump(data, jf, indent=4)
|
||||
|
||||
|
||||
def getContent(key: str):
|
||||
try:
|
||||
with open("{}/config.json".format(base_path), "r+") as jf:
|
||||
with open("config.json", "r+") as jf:
|
||||
return json.load(jf)[key]
|
||||
except KeyError:
|
||||
return None
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
|
|
Loading…
Reference in a new issue