2017-03-28 15:54:14 +13:00
|
|
|
import discord
|
|
|
|
import random
|
|
|
|
import pendulum
|
|
|
|
import asyncio
|
|
|
|
|
|
|
|
from discord.ext import commands
|
|
|
|
|
|
|
|
from . import utils
|
|
|
|
|
|
|
|
class Roulette:
|
|
|
|
|
|
|
|
def __init__(self, bot):
|
|
|
|
self.bot = bot
|
|
|
|
self.roulettes = []
|
|
|
|
|
|
|
|
def get_game(self, server):
|
|
|
|
for x in self.roulettes:
|
|
|
|
if x.server == server:
|
|
|
|
return x
|
|
|
|
|
2017-03-28 16:11:36 +13:00
|
|
|
def start_game(self, server, time):
|
2017-03-28 15:54:14 +13:00
|
|
|
game = self.get_game(server)
|
|
|
|
if game:
|
|
|
|
return False
|
|
|
|
else:
|
2017-03-28 16:11:36 +13:00
|
|
|
game = Game(server, time)
|
2017-03-28 15:54:14 +13:00
|
|
|
self.roulettes.append(game)
|
|
|
|
return game
|
|
|
|
|
2017-03-28 16:06:05 +13:00
|
|
|
def end_game(self, server):
|
|
|
|
game = self.get_game(server)
|
|
|
|
member = game.choose()
|
|
|
|
self.roulettes.remove(game)
|
|
|
|
return member
|
|
|
|
|
2017-04-09 15:04:46 +12:00
|
|
|
@commands.group(invoke_without_command=True)
|
|
|
|
@commands.guild_only()
|
2017-03-28 15:54:14 +13:00
|
|
|
@utils.custom_perms(send_messages=True)
|
|
|
|
async def roulette(self, ctx):
|
|
|
|
"""Joins the current running roulette
|
|
|
|
|
|
|
|
EXAMPLE: !roulette
|
|
|
|
RESULT: You're probably going to get kicked..."""
|
|
|
|
r = self.get_game(ctx.message.guild)
|
|
|
|
if not r:
|
|
|
|
await ctx.send("There is no roulette game running on this server!")
|
|
|
|
else:
|
|
|
|
result = r.join(ctx.message.author)
|
|
|
|
time_left = r.time_left
|
|
|
|
if result:
|
2017-03-28 16:06:05 +13:00
|
|
|
await ctx.send("You have joined this roulette game! Good luck~ This roulette will end in " + time_left)
|
2017-03-28 15:54:14 +13:00
|
|
|
else:
|
2017-03-28 16:06:05 +13:00
|
|
|
await ctx.send("This roulette will end in " + time_left)
|
2017-03-28 15:54:14 +13:00
|
|
|
|
|
|
|
@roulette.command(name='start', aliases=['create'])
|
2017-04-09 15:04:46 +12:00
|
|
|
@commands.guild_only()
|
2017-03-28 15:54:14 +13:00
|
|
|
@utils.custom_perms(kick_members=True)
|
2017-03-28 15:55:21 +13:00
|
|
|
async def roulette_start(self, ctx, time: int=5):
|
2017-03-28 15:54:14 +13:00
|
|
|
"""Starts a roulette, that will end in one of the entrants being kicked from the server
|
2017-03-28 16:06:05 +13:00
|
|
|
By default, the roulette will end in 5 minutes; provide a number (up to 30) to change how many minutes until it ends
|
2017-03-28 15:54:14 +13:00
|
|
|
|
|
|
|
EXAMPLE: !roulette start
|
|
|
|
RESULT: A new roulette game!"""
|
|
|
|
if time < 1 or time > 30:
|
|
|
|
await ctx.send("Invalid time! The roulette must be set to run between 1 and 30 minutes")
|
|
|
|
return
|
|
|
|
else:
|
2017-03-28 16:11:36 +13:00
|
|
|
game = self.start_game(ctx.message.guild, time)
|
2017-03-28 15:54:14 +13:00
|
|
|
if game:
|
2017-04-02 09:12:44 +12:00
|
|
|
await ctx.send("A new roulette game has just started! A random entrant will be kicked in {} minutes."\
|
2017-03-28 15:54:14 +13:00
|
|
|
" Type {}roulette to join this roulette...good luck~".format(game.time_left, ctx.prefix))
|
|
|
|
else:
|
|
|
|
await ctx.send("There is already a roulette game running on this server!")
|
|
|
|
return
|
|
|
|
|
|
|
|
await asyncio.sleep(time * 60)
|
2017-03-28 16:06:05 +13:00
|
|
|
member = self.end_game(ctx.message.guild)
|
|
|
|
|
2017-03-28 15:54:14 +13:00
|
|
|
if member is None:
|
|
|
|
await ctx.send("Well no one joined the roulette. That was boring.")
|
|
|
|
return
|
|
|
|
|
|
|
|
try:
|
|
|
|
fmt = "The unlucky member to be kicked is {}; hopefully someone invites them back".format(member.display_name)
|
|
|
|
await member.kick()
|
|
|
|
except discord.Forbidden:
|
|
|
|
fmt = "Well, the unlucky member chosen was {} but I can't kick you...so kick yourself please?".format(member.display_name)
|
|
|
|
|
|
|
|
await ctx.send(fmt)
|
|
|
|
|
|
|
|
|
|
|
|
class Game:
|
|
|
|
|
2017-03-28 16:11:36 +13:00
|
|
|
def __init__(self, guild, time):
|
2017-03-28 15:54:14 +13:00
|
|
|
self.entrants = []
|
|
|
|
self.server = guild
|
2017-03-28 16:11:36 +13:00
|
|
|
self.end_time = pendulum.utcnow().add(minutes=time)
|
2017-03-28 15:54:14 +13:00
|
|
|
|
|
|
|
@property
|
|
|
|
def time_left(self):
|
2017-03-28 16:11:36 +13:00
|
|
|
return (self.end_time - pendulum.utcnow()).in_words()
|
2017-03-28 15:54:14 +13:00
|
|
|
|
|
|
|
def join(self, member):
|
|
|
|
"""Adds a member to the list of entrants"""
|
|
|
|
if member in self.entrants:
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
self.entrants.append(member)
|
|
|
|
return True
|
|
|
|
|
|
|
|
def choose(self):
|
|
|
|
try:
|
|
|
|
return random.SystemRandom().choice(self.entrants)
|
|
|
|
except IndexError:
|
|
|
|
return None
|
2017-03-28 15:56:20 +13:00
|
|
|
|
|
|
|
def setup(bot):
|
|
|
|
bot.add_cog(Roulette(bot))
|