Advertisement
Guest User

lottery.py

a guest
May 3rd, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.17 KB | None | 0 0
  1. import os
  2. import logging
  3. import time
  4. from discord.ext import commands
  5. from .utils.dataIO import fileIO
  6. from .utils import checks
  7. from __main__ import send_cmd_help
  8. from random import choice as randchoice
  9.  
  10.  
  11. class Lottery:
  12. """Starts a lottery on the server"""
  13.  
  14. def __init__(self, bot):
  15. self.bot = bot
  16. self.players = fileIO("data/lottery/players.json", "load")
  17. self.system = fileIO("data/lottery/system.json", "load")
  18. self.funny = ["Rigging the system...",
  19. "Removing tickets that didn't pay me off...",
  20. "Adding fake tickets...", "Throwing out the bad names..",
  21. "Switching out the winning ticket...",
  22. "Picking from highest bribe...",
  23. "Looking for a marked ticket...",
  24. "Eeny, meeny, miny, moe...",
  25. "I lost the tickets so...",
  26. "Stop messaging me, I'm picking..."]
  27.  
  28. @commands.group(name="lottery", pass_context=True)
  29. async def _lottery(self, ctx):
  30. """Lottery Commands."""
  31. if ctx.invoked_subcommand is None:
  32. await send_cmd_help(ctx)
  33.  
  34. @_lottery.command(pass_context=True, no_pm=True)
  35. @checks.admin_or_permissions(manage_server=True)
  36. async def fun(self, ctx):
  37. """Add/Removes some fun text to picking the winner"""
  38. if self.system["funny"] == "Off":
  39. self.system["funny"] = "On"
  40. fileIO("data/lottery/system.json", "save", self.system)
  41. await self.bot.say("Fun text for the lottery is now ON!")
  42.  
  43. elif self.system["funny"] == "On":
  44. self.system["funny"] = "Off"
  45. fileIO("data/lottery/system.json", "save", self.system)
  46. await self.bot.say("Fun text for the lottery is now OFF!")
  47. else:
  48. await self.bot.say("Missing funny parameter. Delete your " +
  49. "system.json file in your lottery folder.")
  50.  
  51. @_lottery.command(pass_context=True, no_pm=True)
  52. @checks.admin_or_permissions(manage_server=True)
  53. async def start(self, ctx):
  54. """Begins the lottery until you enter a stop command"""
  55. user = ctx.message.author
  56. if self.system["lottery_start"] == "Inactive":
  57. self.system["lottery_start"] = "Active"
  58. self.system["lotteries_played"] = self.system[
  59. "lotteries_played"
  60. ] + 1
  61. fileIO("data/lottery/system.json", "save", self.system)
  62. await self.bot.say("A lottery has been started by " +
  63. user.mention + "\n" +
  64. "To enter type, !lottery play." +
  65. " Make sure to sign up or you can't play!!")
  66. else:
  67. await self.bot.say("You cannot start another lottery while one" +
  68. " is active." + "\n" + "End the current" +
  69. " lottery to start another.")
  70.  
  71. @_lottery.command(pass_context=True, no_pm=True)
  72. @checks.admin_or_permissions(manage_server=True)
  73. async def end(self, ctx):
  74. """This will stop the lottery and pick a winner"""
  75. if self.system["lottery_start"] == "Active":
  76. self.system["lottery_start"] = "Inactive"
  77. fileIO("data/lottery/system.json", "save", self.system)
  78. results = []
  79. for subdict in self.players.values():
  80. results.append(subdict['current_ticket'])
  81. for subdict in self.players.values():
  82. subdict['ticket_played'] = "No"
  83. fileIO("data/lottery/players.json", "save", self.players)
  84. f = list(filter(None, results))
  85. winner = randchoice(f)
  86. funny = randchoice(self.funny)
  87. await self.bot.say("The winner is...")
  88. time.sleep(2)
  89. if self.system["funny"] == "On":
  90. await self.bot.say(str(funny))
  91. time.sleep(5)
  92. await self.bot.say(str(winner) + "!!!" +
  93. "\n" + "Congratulations " + str(winner))
  94. lookup = which_dict_key(winner, self.players)
  95. extract = lookup[0]
  96. self.players[extract]["lotteries_won"] = self.players[
  97. extract
  98. ]["lotteries_won"] + 1
  99. fileIO("data/lottery/players.json", "save", self.players)
  100. for subdict in self.players.values():
  101. subdict['current_ticket'] = ""
  102. fileIO("data/lottery/players.json", "save", self.players)
  103. else:
  104. await self.bot.say(str(winner) + "!!!" +
  105. "\n" + "Congratulations " + str(winner))
  106. lookup = which_dict_key(winner, self.players)
  107. extract = lookup[0]
  108. self.players[extract]["lotteries_won"] = self.players[
  109. extract
  110. ]["lotteries_won"] + 1
  111. fileIO("data/lottery/players.json", "save", self.players)
  112. for subdict in self.players.values():
  113. subdict['current_ticket'] = ""
  114. fileIO("data/lottery/players.json", "save", self.players)
  115.  
  116. else:
  117. await self.bot.say("You can't end a lottery that I have"
  118. " not started.")
  119.  
  120. @_lottery.command(pass_context=True, no_pm=True)
  121. async def signup(self, ctx):
  122. """This allows a user to sign-up to play lotteries"""
  123. user = ctx.message.author
  124. if user.id not in self.players:
  125. self.players[user.id] = {"name": user.name,
  126. "lotteries_played": 0,
  127. "lotteries_won": 0,
  128. "current_ticket": "",
  129. "ticket_played": "No"}
  130. fileIO("data/lottery/players.json", "save", self.players)
  131. await self.bot.say("You have joined the lottery system " +
  132. user.mention + ". You can now participate in" +
  133. " all future lotteries")
  134. else:
  135. await self.bot.say("You are already a lottery member")
  136.  
  137. @_lottery.command(pass_context=True, no_pm=True)
  138. async def play(self, ctx):
  139. """This let's a user play in an on-going lottery"""
  140. user = ctx.message.author
  141. id = user.id
  142. if self.system["lottery_start"] == "Active":
  143. if user.id in self.players:
  144. if self.players[id]["ticket_played"] == "No":
  145. self.players[id]["ticket_played"] = "Yes"
  146. self.players[id]["current_ticket"] = user.name
  147. self.players[id]["lotteries_played"] = self.players[id][
  148. "lotteries_played"
  149. ] + 1
  150. fileIO("data/lottery/players.json", "save", self.players)
  151. await self.bot.say("You have been entered into the" +
  152. " lottery")
  153. else:
  154. await self.bot.say("You have already been entered into " +
  155. "this lottery.")
  156. else:
  157. await self.bot.say("You need to sign-up to play in an " +
  158. "ongoing lottery")
  159. else:
  160. await self.bot.say("There is currently no on-going lottery")
  161.  
  162. @_lottery.command(pass_context=True, no_pm=True)
  163. async def stats(self, ctx):
  164. """Retrieves a user's lottery stats"""
  165. user = ctx.message.author
  166. id = user.id
  167. if user.id in self.players:
  168. played = self.players[id]["lotteries_played"]
  169. wins = self.players[id]["lotteries_won"]
  170. await self.bot.say("\n" + "```" + "Lotteries Played: " +
  171. str(played) + "\n" +
  172. "Lotteries Won: " + str(wins) + "```")
  173. else:
  174. await self.bot.say("You need to sign-up for lotteries first.")
  175.  
  176.  
  177. def which_dict_key(value, dicts):
  178. '''
  179. Return a list of keys for a dictionary where the value dictionary
  180. for that key includes the value provided.
  181. '''
  182. return [key for key in dicts if value in dicts[key].values()]
  183.  
  184.  
  185. def check_folders():
  186. if not os.path.exists("data/lottery"):
  187. print("Creating data/lottery folder...")
  188. os.makedirs("data/lottery")
  189.  
  190.  
  191. def check_files():
  192. system = {"lotteries_played": 0, "lottery_start": "Inactive",
  193. "funny": "Off"}
  194.  
  195. f = "data/lottery/system.json"
  196. if not fileIO(f, "check"):
  197. print("Creating default lottery system.json...")
  198. fileIO(f, "save", system)
  199. else: # consistency check
  200. current = fileIO(f, "load")
  201. if current.keys() != system.keys():
  202. for key in system.keys():
  203. if key not in current.keys():
  204. current[key] = system[key]
  205. print("Adding " + str(key) +
  206. " field to lottery system.json")
  207. fileIO(f, "save", current)
  208.  
  209. f = "data/lottery/players.json"
  210. if not fileIO(f, "check"):
  211. print("Adding lottery player.json...")
  212. fileIO(f, "save", {})
  213.  
  214.  
  215. def setup(bot):
  216. global logger
  217. check_folders()
  218. check_files()
  219. logger = logging.getLogger("lottery")
  220. # Prevents the logger from being loaded again in case of module reload
  221. if logger.level == 0:
  222. logger.setLevel(logging.INFO)
  223. handler = logging.FileHandler(filename='data/lottery/lottery.log',
  224. encoding='utf-8', mode='a')
  225. handler.setFormatter(logging.Formatter('%(asctime)s %(message)s',
  226. datefmt="[%d/%m/%Y %H:%M]"))
  227. logger.addHandler(handler)
  228. bot.add_cog(Lottery(bot))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement