145 lines
4.5 KiB
Python
145 lines
4.5 KiB
Python
import aiohttp
|
|
import logging
|
|
import json
|
|
import discord
|
|
|
|
from utils import config
|
|
from discord.ext import commands
|
|
|
|
log = logging.getLogger()
|
|
|
|
discord_bots_url = "https://bots.discord.pw/api/bots/{}/stats"
|
|
discordbots_url = "https://discordbots.org/api/bots/{}/stats"
|
|
carbonitex_url = "https://www.carbonitex.net/discord/data/botdata.php"
|
|
|
|
|
|
class StatsUpdate(commands.Cog):
|
|
"""This is used purely to update stats information for the bot sites"""
|
|
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.session = aiohttp.ClientSession()
|
|
|
|
def cog_unload(self):
|
|
self.bot.loop.create_task(self.session.close())
|
|
|
|
async def update(self):
|
|
server_count = len(self.bot.guilds)
|
|
|
|
# Carbonitex request
|
|
carbon_payload = {"key": config.carbon_key, "servercount": server_count}
|
|
|
|
async with self.session.post(carbonitex_url, data=carbon_payload) as resp:
|
|
log.info(
|
|
"Carbonitex statistics returned {} for {}".format(
|
|
resp.status, carbon_payload
|
|
)
|
|
)
|
|
|
|
# Discord.bots.pw request
|
|
payload = json.dumps({"server_count": server_count})
|
|
|
|
headers = {
|
|
"authorization": config.discord_bots_key,
|
|
"content-type": "application/json",
|
|
}
|
|
|
|
url = discord_bots_url.format(self.bot.user.id)
|
|
async with self.session.post(url, data=payload, headers=headers) as resp:
|
|
log.info(
|
|
"bots.discord.pw statistics returned {} for {}".format(
|
|
resp.status, payload
|
|
)
|
|
)
|
|
|
|
# discordbots.com request
|
|
url = discordbots_url.format(self.bot.user.id)
|
|
payload = {"server_count": server_count}
|
|
|
|
headers = {"Authorization": config.discordbots_key}
|
|
async with self.session.post(url, data=payload, headers=headers) as resp:
|
|
log.info(
|
|
"discordbots.com statistics retruned {} for {}".format(
|
|
resp.status, payload
|
|
)
|
|
)
|
|
|
|
@commands.Cog.listener()
|
|
async def on_guild_join(self, _):
|
|
await self.update()
|
|
|
|
@commands.Cog.listener()
|
|
async def on_guild_leave(self, _):
|
|
await self.update()
|
|
|
|
@commands.Cog.listener()
|
|
async def on_ready(self):
|
|
await self.update()
|
|
|
|
@commands.Cog.listener()
|
|
async def on_member_join(self, member):
|
|
query = """
|
|
SELECT
|
|
COALESCE(welcome_alerts, default_alerts) AS channel,
|
|
welcome_msg AS msg,
|
|
join_role as role,
|
|
welcome_notifications as notify
|
|
FROM
|
|
guilds
|
|
WHERE
|
|
id = $1
|
|
"""
|
|
settings = await self.bot.db.fetchrow(query, member.guild.id)
|
|
if settings:
|
|
message = settings["msg"] or "Welcome to the '{server}' server {member}!"
|
|
if settings["notify"]:
|
|
try:
|
|
channel = member.guild.get_channel(settings["channel"])
|
|
await channel.send(
|
|
message.format(server=member.guild.name, member=member.mention)
|
|
)
|
|
# Forbidden for if the channel has send messages perms off
|
|
# HTTP Exception to catch any weird happenings
|
|
# Attribute Error catches when a channel is set, but that channel doesn't exist any more
|
|
except (discord.Forbidden, discord.HTTPException, AttributeError):
|
|
pass
|
|
|
|
try:
|
|
role = member.guild.get_role(settings["role"])
|
|
await member.add_roles(role)
|
|
except (discord.Forbidden, discord.HTTPException, AttributeError):
|
|
pass
|
|
|
|
@commands.Cog.listener()
|
|
async def on_member_remove(self, member):
|
|
query = """
|
|
SELECT
|
|
COALESCE(goodbye_alerts, default_alerts) AS channel,
|
|
goodbye_msg AS msg
|
|
FROM
|
|
guilds
|
|
WHERE
|
|
goodbye_notifications = True
|
|
AND
|
|
id = $1
|
|
AND
|
|
COALESCE(goodbye_alerts, default_alerts) IS NOT NULL
|
|
"""
|
|
settings = await self.bot.db.fetchrow(query, member.guild.id)
|
|
if settings:
|
|
message = (
|
|
settings["msg"]
|
|
or "{member} has left the server, I hope it wasn't because of something I said :c"
|
|
)
|
|
channel = member.guild.get_channel(settings["channel"])
|
|
try:
|
|
await channel.send(
|
|
message.format(server=member.guild.name, member=member.mention)
|
|
)
|
|
except (discord.Forbidden, discord.HTTPException, AttributeError):
|
|
pass
|
|
|
|
|
|
def setup(bot):
|
|
bot.add_cog(StatsUpdate(bot))
|