Files
stroopwafel/Points.py
T
2019-06-03 21:18:45 +02:00

137 lines
4.8 KiB
Python

import asyncio
import discord
from discord.ext import commands
from pprint import pprint
import time
import numpy as np
import random
class Points(object):
"""Geef elkaar punten!"""
def __init__(self, bot):
self.bot = bot
self.voice_states = {}
#a = discord.get_channel(self.bot.hdChannels["shitpost"])
#pprint(a)
def __check(self, ctx):
return True
@commands.command(pass_context=True, hidden=False)
@asyncio.coroutine
def geefpunten(self, ctx, user, points: int):
"""Wees eens lief. Geef iemand wat punten.
Bijvoorbeeld:
!geefpunten @ikbenjp 42
Let op: je moet iemand taggen om punten uit te delen
"""
if points == 0:
yield from ctx.channel.send("0 punten? Gul hoor.")
return
if points < 0:
yield from ctx.channel.send("Doeslief. Je mag (nog) geen punten afnemen.")
return
if user[0:2] != "<@":
try:
yield from ctx.message.delete()
yield from ctx.message.author.send("Je moet iemand taggen om punten te geven. :)")
#TODO ook userId oid toestaan?
except:
print("No permission to delete message or send DM")
return
userObj = self.bot.get_user( int(user.replace("<@!", "").replace("<@", "").replace(">", "")) )
if userObj.id == ctx.author.id:
yield from ctx.channel.send("Nee. Je mag niet jezelf punten geven.")
time.sleep(0.6)
yield from ctx.channel.send("Gekkie.")
return
if not self.isUserOnList(userObj):
yield from ctx.channel.send("Nee. Die krijgt geen punten.")
return
if self.getUserBalance(ctx.author) < points:
yield from ctx.channel.send("Daar heb jij niet genoeg puntjes voor. :bell:")
return
self.transferPoints(ctx.author, userObj, points)
message = self.getMessageForAwardingPoints(ctx.author.name, userObj.name, points)
yield from ctx.channel.send(message)
@commands.command(pass_context=True, hidden=False)
@asyncio.coroutine
def puntentelling(self, ctx):
"""Hoeveel punten heeft iedereen?
"""
message = "**De puntentelling:** \n```"
pointsCount = np.load('pointscount.npy').item()
pointsCountSorted = sorted(pointsCount.items(), key=lambda i: i[1]['points'], reverse=True)
for user in pointsCountSorted:
message += str(user[1]["points"]).rjust(4) + " " + user[1]["name"] + "\n"
message += "```"
yield from ctx.channel.send(message)
# Transfer points form one user to another
def transferPoints(self, fromUser, toUser, points):
pointsCount = np.load('pointscount.npy').item()
pointsCount[fromUser.id]["points"] -= points
pointsCount[toUser.id]["points"] += points
np.save("pointscount.npy", pointsCount)
# Do we know this user?
def isUserOnList(self, user):
pointsCount = np.load('pointscount.npy').item()
return user.id in pointsCount.keys()
# Get a user's point balance
def getUserBalance(self, user):
pointsCount = np.load('pointscount.npy').item()
return pointsCount[user.id]["points"]
# Generate a semi-random text to tell somebody they got some shiny new points
def getMessageForAwardingPoints(self, userNameFrom: str, userNameTo: str, points: int):
p = str(points)
if points == 1:
grammarFixer = {"suffixGb":"", "suffixNl":"", "zijnOfIs": "is"}
else:
grammarFixer = {"suffixGb":"s", "suffixNl":"en", "zijnOfIs": "zijn"}
messages = [
p + " punt" + grammarFixer["suffixNl"] + " voor " + userNameTo + ".",
userNameTo + " krijgt " + p + " punt" + grammarFixer["suffixNl"] + ".",
userNameTo + " krijgt " + p + " punt" + grammarFixer["suffixNl"] + " van " + userNameFrom,
p + " POINT" + grammarFixer["suffixGb"].upper() + " TO GRYFFINDO.. oh.. " + userNameTo + ".",
userNameTo + ", jij krijgt " + p + " puntje" + grammarFixer["suffixGb"] + " van " + userNameFrom + ". Lief he? :heart:",
"+" + p + " punt" + grammarFixer["suffixNl"] + " voor " + userNameTo + "! Highscore!",
userNameTo + ", alsjeblieft, " + p + " punt" + grammarFixer["suffixNl"] + ".",
"Hier " + grammarFixer["zijnOfIs"] + " " + p + " punt" + grammarFixer["suffixNl"] + ", " + userNameTo + ". Don't spend it all in one place...",
"Jij kan wel " + p + " punt" + grammarFixer["suffixNl"] + " gebruiken, " + userNameTo + ".",
p + " blockchain smartcontract punt" + grammarFixer["suffixNl"] + " voor " + userNameTo + ". :rocket: "
]
return messages[random.randint(0, len(messages)-1)]
def init(self):
# Check if points file exists:
try:
pointsCount = np.load('pointscount.npy').item()
except FileNotFoundError:
np.save("pointscount.npy", {})
pointsCount = np.load('pointscount.npy').item()
memberList = self.bot.get_channel(self.bot.hdChannels["shitpost"]).members
for member in memberList:
# Give new members 100 points
if member.id not in pointsCount.keys() and not member.bot:
pointsCount[member.id] = {"name": member.name, "points": 100}
np.save("pointscount.npy", pointsCount)