1
0
Fork 0
mirror of synced 2024-05-20 20:42:27 +12:00

Add a roulette command

This commit is contained in:
Phxntxm 2017-03-27 21:54:14 -05:00
parent e8b725484a
commit 7f2db7b3a6

106
cogs/roulette.py Normal file
View file

@ -0,0 +1,106 @@
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
def start_game(self, server):
game = self.get_game(server)
if game:
return False
else:
game = Game(server)
self.roulettes.append(game)
return game
@commands.group(no_pm=True, invoke_without_command=True)
@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:
await ctx.send("You have joined this roul!debug ctx.prefixette game! Good luck~ This roulette will end in " + time_left)
else:
await ctx.send("You have already joined this roulette game! This roulette will end in " + time_left)
@roulette.command(name='start', aliases=['create'])
@utils.custom_perms(kick_members=True)
async def roulette_start(self, ctx, time: int=5)
"""Starts a roulette, that will end in one of the entrants being kicked from the server
By default, the roulette will end up 5 minutes; provide a number (up to 30) to change how many minutes until it ends
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:
game = self.start_game(ctx.message.guild)
if game:
await ctx.send("A new roulette game has just started! A random entrant will be kicked in {} minutes"\
" 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)
member = game.choose()
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:
def __init__(self, guild):
self.entrants = []
self.server = guild
self.start_time = pendulum.utcnow()
@property
def time_left(self):
return (pendulum.utcnow() - self.bot.uptime).in_words()
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