156 lines
6.3 KiB
Python
156 lines
6.3 KiB
Python
import asyncio
|
|
import math
|
|
from datetime import datetime, timedelta
|
|
|
|
import discord
|
|
import pymysql
|
|
from discord.ext import commands
|
|
|
|
|
|
# password = open("../../../sqlPass.txt", 'r')
|
|
|
|
def get_con():
|
|
return pymysql.connect(host='192.168.1.52',
|
|
port=5618,
|
|
user='Quentin',
|
|
password='kaPl0wskii',
|
|
db='mc',
|
|
charset='utf8mb4',
|
|
cursorclass=pymysql.cursors.DictCursor)
|
|
|
|
|
|
class McRoll(commands.Cog):
|
|
def __init__(self, client):
|
|
self.client = client
|
|
self.currentPoll = None
|
|
self.embedInfo = """Each server has a multiplier based on how long it has been sense that server has been rolled.
|
|
When this poll is over all servers with 0 votes will be disregarded.
|
|
If there are 4 or more servers left the two with the lowest votes will be disregarded.
|
|
Poll is rerun until there are only 2 servers, these two are the winners. Ties reroll the poll.
|
|
You can only vote for one server per poll. """
|
|
|
|
|
|
async def start_poll(self, ctx, choices):
|
|
embed = discord.Embed(title="Poll", description=self.embedInfo, timestamp=datetime.now() + timedelta(hours=12))
|
|
for choice in choices.items():
|
|
choice = choice[1]
|
|
embed.add_field(
|
|
name=choice['serverName'] + ' ' + (str(self.client.get_emoji(int(choice['reaction'])))
|
|
if choice['getEmoji']
|
|
else bytes(choice['reaction'], "utf-8").decode("unicode_escape")),
|
|
value="Multiplier : " + str(round(2 * math.log10(choice['lastActivated'] + 1) + 1, 2)) + '\n' +
|
|
"Last Rolled : " + str(choice['lastActivated'] * 2) + " weeks ago.")
|
|
self.currentPoll = await ctx.channel.send(embed=embed)
|
|
await ctx.channel.send("@everyone")
|
|
for choice in choices.items():
|
|
choice = choice[1]
|
|
await self.currentPoll.add_reaction(self.client.get_emoji(int(choice['reaction']))
|
|
if choice['getEmoji']
|
|
else bytes(choice['reaction'], "utf-8").decode("unicode_escape"))
|
|
await asyncio.sleep(43200)
|
|
|
|
for reaction in self.currentPoll.reactions:
|
|
async for user in reaction.users():
|
|
serverIp = self.reaction_to_serverip(reaction)
|
|
if user.id != 533427166193385494:
|
|
choices[serverIp]['votes'] = choices[serverIp]['votes'] + 1
|
|
|
|
choices[serverIp]['score'] = choices[serverIp]['votes'] * round(
|
|
2 * math.log10(choices[serverIp]['lastActivated'] + 1) + 1, 2)
|
|
|
|
for choice in list(choices):
|
|
if choices[choice]['score'] <= 0:
|
|
choices.pop(choice)
|
|
continue
|
|
|
|
if len(choices) >= 4:
|
|
choices = self.pop_lowest(choices)
|
|
choices = self.pop_lowest(choices)
|
|
elif len(choices) == 3:
|
|
choices = self.pop_lowest(choices)
|
|
|
|
return choices
|
|
|
|
|
|
def pop_lowest(self, choices):
|
|
lowest = {'score': 10}
|
|
pop = False
|
|
for choice in list(choices):
|
|
if choices[choice]['score'] < lowest['score']:
|
|
lowest = choices[choice]
|
|
pop = True
|
|
if pop:
|
|
choices.pop(lowest['serverIP'])
|
|
return choices
|
|
|
|
def reaction_to_serverip(self, reaction):
|
|
con = get_con()
|
|
escapedReaction = reaction.emoji.encode('unicode_escape').decode('utf-8')
|
|
with con.cursor() as cursor:
|
|
cursor.execute("SELECT serverIP FROM mc.server_list WHERE reaction=%s;", escapedReaction)
|
|
serverIp = cursor.fetchone()
|
|
con.close()
|
|
return serverIp['serverIP']
|
|
|
|
|
|
@commands.Cog.listener()
|
|
async def on_reaction_add(self, reaction, user):
|
|
reactedUsers = {}
|
|
if reaction.message.id == self.currentPoll.id and user.id != 533427166193385494:
|
|
for iReaction in reaction.message.reactions:
|
|
async for iUser in iReaction.users():
|
|
if iUser.id != 533427166193385494:
|
|
if iUser.id not in reactedUsers:
|
|
reactedUsers[iUser.id] = False
|
|
if reactedUsers[iUser.id]:
|
|
await reaction.remove(user)
|
|
self.currentPoll = reaction.message
|
|
await user.send(
|
|
"You can only vote for one option, please remove your previous vote to change it.")
|
|
return
|
|
self.currentPoll = reaction.message
|
|
reactedUsers[iUser.id] = True
|
|
|
|
|
|
@commands.command()
|
|
async def mc_roll(self, ctx):
|
|
if ctx.message.author.id != 305589587215122432:
|
|
return
|
|
|
|
con = get_con()
|
|
with con.cursor() as cursor:
|
|
cursor.execute("SELECT serverIP, serverName, lastActivated, reaction, getEmoji "
|
|
"FROM mc.server_list WHERE lastActivated is not null")
|
|
choices = cursor.fetchall()
|
|
con.close()
|
|
|
|
dictChoices = {}
|
|
for choice in choices:
|
|
choice['score'] = 0
|
|
choice['votes'] = 0
|
|
dictChoices[choice['serverIP']] = choice
|
|
|
|
dictChoices = await self.start_poll(ctx, dictChoices)
|
|
|
|
while len(dictChoices) > 2:
|
|
print(dictChoices)
|
|
dictChoices = await self.start_poll(ctx, dictChoices)
|
|
|
|
embed = discord.Embed(title="Winner", description="Congratulations")
|
|
for item in list(dictChoices):
|
|
winner = dictChoices[item]
|
|
embed.add_field(
|
|
name=winner['serverName'],
|
|
value="Multiplier : " + str(round(2 * math.log10(winner['lastActivated'] + 1) + 1, 2)) + '\n' +
|
|
"Last Rolled : " + str(winner['lastActivated'] * 2) + " weeks ago." + '\n' +
|
|
"Votes : " + str(winner['votes']) + '\n' +
|
|
"Calculated Votes: " + str(winner['votes'] * round(2 * math.log10(winner['lastActivated'] + 1) + 1, 2))
|
|
)
|
|
|
|
await ctx.channel.send(embed=embed)
|
|
await ctx.channel.send("@everyone")
|
|
|
|
|
|
def setup(client):
|
|
client.add_cog(McRoll(client))
|