Setup basic xp and show stats
This commit is contained in:
parent
392ae5e3eb
commit
64d25950e3
2 changed files with 105 additions and 0 deletions
|
@ -4,3 +4,4 @@ bot.load_extension("extensions.help")
|
|||
bot.load_extension("extensions.speak")
|
||||
bot.load_extension("extensions.extension")
|
||||
bot.load_extension("extensions.purge")
|
||||
bot.load_extension("extensions.xp")
|
||||
|
|
104
extensions/xp.py
Normal file
104
extensions/xp.py
Normal file
|
@ -0,0 +1,104 @@
|
|||
from discord.ext import commands
|
||||
from discord import Embed, Message
|
||||
from threading import RLock
|
||||
from shelve import open
|
||||
from datetime import datetime, timedelta
|
||||
from re import compile
|
||||
|
||||
from bot_bde.logger import logger
|
||||
|
||||
|
||||
extension_name = "xp"
|
||||
logger = logger.getChild(extension_name)
|
||||
|
||||
url_re = compile(r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\), ]|(?:%[0-9a-fA-F][0-9a-fA-F]))+")
|
||||
XP = {"message": 2,
|
||||
"image": 15,
|
||||
"file": 20,
|
||||
"link": 10}
|
||||
|
||||
class Xp(commands.Cog):
|
||||
def __init__(self, bot: commands.Bot):
|
||||
self.bot = bot
|
||||
self.lock = RLock()
|
||||
|
||||
@commands.group("xp", pass_context=True)
|
||||
@commands.guild_only()
|
||||
async def xp(self, ctx: commands.Context):
|
||||
if ctx.invoked_subcommand is None:
|
||||
player = None
|
||||
with self.lock:
|
||||
with open("xp", writeback=True) as data:
|
||||
if str(ctx.author.id) in data:
|
||||
player = data[str(ctx.author.id)]
|
||||
embed = Embed(title="Current stats")
|
||||
embed.add_field(name="level", value=player["level"])
|
||||
embed.add_field(name="xp", value=player["xp"])
|
||||
embed.add_field(name="message", value=player["message"])
|
||||
embed.add_field(name="image", value=player["image"])
|
||||
embed.add_field(name="file", value=player["file"])
|
||||
embed.add_field(name="link", value=player["link"])
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
@xp.group("help", pass_context=True)
|
||||
@commands.guild_only()
|
||||
async def xp_help(self, ctx: commands.Context):
|
||||
embed = Embed(title="Xp help")
|
||||
embed.add_field(name="xp", value="Show your current cp", inline=False)
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self, message: Message):
|
||||
if not message.author.bot:
|
||||
with self.lock:
|
||||
with open("xp", writeback=True) as data:
|
||||
can_xp = False
|
||||
if not str(message.author.id) in data:
|
||||
can_xp = True
|
||||
data[str(message.author.id)] = {"xp": 0,
|
||||
"level": 0,
|
||||
"message": 0,
|
||||
"image": 0,
|
||||
"file": 0,
|
||||
"link": 0,
|
||||
"last_message": message.created_at}
|
||||
if message.created_at - data[str(message.author.id)]["last_message"] >= timedelta(minutes=5):
|
||||
can_xp = True
|
||||
data[str(message.author.id)]["message"] += 1
|
||||
if can_xp:
|
||||
data[str(message.author.id)]["xp"] += XP["message"]*len(message.content)
|
||||
if url_re.match(message.content):
|
||||
data[str(message.author.id)]["link"] += 1
|
||||
if can_xp:
|
||||
data[str(message.author.id)]["xp"] += XP["link"]
|
||||
if message.attachments:
|
||||
for a in message.attachments:
|
||||
if a.width is not None:
|
||||
data[str(message.author.id)]["image"] += 1
|
||||
if can_xp:
|
||||
data[str(message.author.id)]["xp"] += XP["image"]
|
||||
else:
|
||||
data[str(message.author.id)]["file"] += 1
|
||||
if can_xp:
|
||||
data[str(message.author.id)]["xp"] += XP["file"]
|
||||
data[str(message.author.id)]["last_message"] = message.created_at
|
||||
|
||||
|
||||
def setup(bot):
|
||||
logger.info(f"Loading...")
|
||||
try:
|
||||
bot.add_cog(Xp(bot))
|
||||
except Exception as e:
|
||||
logger.error(f"Error loading: {e}")
|
||||
else:
|
||||
logger.info(f"Load successful")
|
||||
|
||||
|
||||
def teardown(bot):
|
||||
logger.info(f"Unloading...")
|
||||
try:
|
||||
bot.remove_cog("Speak")
|
||||
except Exception as e:
|
||||
logger.error(f"Error unloading: {e}")
|
||||
else:
|
||||
logger.info(f"Unload successful")
|
Reference in a new issue