Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.19 KB | None | 0 0
  1. import asyncio
  2. import discord
  3. import time
  4. import parsedatetime
  5. from datetime import datetime
  6. from operator import itemgetter
  7. from discord.ext import commands
  8. from Cogs import ReadableTime
  9. from Cogs import DisplayName
  10. from Cogs import Nullify
  11.  
  12. def setup(bot):
  13. # Add the bot
  14. bot.add_cog(TempRole(bot))
  15.  
  16. class TempRole(commands.Cog):
  17.  
  18. # Init with the bot reference, and a reference to the settings var
  19. def __init__(self, bot):
  20. self.bot = bot
  21. self.settings = self.bot.get_cog("Settings")
  22. self.is_current = False # Used for stopping loops
  23. self.loop_list = []
  24.  
  25. def _is_submodule(self, parent, child):
  26. return parent == child or child.startswith(parent + ".")
  27.  
  28. @commands.Cog.listener()
  29. async def on_unloaded_extension(self, ext):
  30. # Called to shut things down
  31. if not self._is_submodule(ext.__name__, self.__module__):
  32. return
  33. self.is_current = False
  34. for task in self.loop_list:
  35. task.cancel()
  36.  
  37. async def onjoin(self, member, server):
  38. # Let the api settle
  39. # Add 2 second delay to hopefully prevent the api from hating us :(
  40. # await asyncio.sleep(2)
  41. # Pls no hate
  42.  
  43. role = self.settings.getServerStat(server, "TempRole")
  44. role_t = self.settings.getServerStat(server, "TempRoleTime")
  45.  
  46. if role == None:
  47. # No temp role
  48. return
  49. if role_t < 1:
  50. # No time
  51. return
  52. role = DisplayName.roleForName(role, server)
  53. if not role:
  54. # Doesn't exist
  55. return
  56.  
  57. # Here we have a member, role, and end time - apply them!
  58. user_roles = self.settings.getUserStat(member, server, "TempRoles")
  59. # Check and see if we're overriding a current time
  60. temp_role = {}
  61. # Add it anew
  62. temp_role["ID"] = role.id
  63. temp_role["Cooldown"] = role_t*60 + int(time.time())
  64. user_roles.append(temp_role)
  65. self.settings.setUserStat(member, server, "TempRoles", user_roles)
  66. self.settings.role.add_roles(member, [role])
  67. self.loop_list.append(self.bot.loop.create_task(self.check_temp_roles(member, temp_role)))
  68.  
  69. @commands.Cog.listener()
  70. async def on_loaded_extension(self, ext):
  71. # See if we were loaded
  72. if not self._is_submodule(ext.__name__, self.__module__):
  73. return
  74. self.is_current = True
  75. self.bot.loop.create_task(self.start_loading())
  76.  
  77. async def start_loading(self):
  78. await self.bot.wait_until_ready()
  79. await self.bot.loop.run_in_executor(None, self.check_temp)
  80.  
  81. def check_temp(self):
  82. # Check if we need to set any role removal timers
  83. t = time.time()
  84. print("Verifying Temp Roles...")
  85. for server in self.bot.guilds:
  86. for member in server.members:
  87. if not self.is_current:
  88. # Bail if we're not the current instance
  89. return
  90. temp_roles = self.settings.getUserStat(member, server, "TempRoles")
  91. if len(temp_roles):
  92. # We have a list
  93. remove_temps = []
  94. for temp_role in temp_roles:
  95. if temp_role["Cooldown"] == None:
  96. # Permanent temp role
  97. # Let's see if the role still exists
  98. found = False
  99. for role in member.roles:
  100. if role.id == int(temp_role["ID"]):
  101. found = True
  102. break
  103. if not found:
  104. remove_temps.append(temp_role)
  105. continue
  106. self.loop_list.append(self.bot.loop.create_task(self.check_temp_roles(member, temp_role)))
  107. # Remove any useless roles now
  108. if len(remove_temps):
  109. for temp in remove_temps:
  110. temp_roles.remove(temp)
  111. print("Temp Roles Done - took {} seconds.".format(time.time() - t))
  112.  
  113. def _remove_task(self, task):
  114. if task in self.loop_list:
  115. self.loop_list.remove(task)
  116.  
  117. def _log(self, message, *, value = None, member = None):
  118. print(" ")
  119. if not member == None:
  120. print(member)
  121. print(message)
  122. if not value == None:
  123. print(value)
  124. print(" ")
  125.  
  126. async def check_temp_roles(self, member, temp_role):
  127. # Get the current task
  128. task = asyncio.Task.current_task()
  129.  
  130. #self._log("Temp Role Object:", value=temp_role, member=member)
  131.  
  132. # Get the cooldown and server id
  133. c = int(temp_role["Cooldown"])
  134. r_id = int(temp_role["ID"])
  135.  
  136. # Wait until we're ready to remove
  137. timeleft = c-int(time.time())
  138.  
  139. #self._log("Time left check 1 - do we have time left?", value=timeleft, member=member)
  140.  
  141. if timeleft > 0:
  142. await asyncio.sleep(timeleft)
  143. # Resolve the role
  144. role = DisplayName.roleForID(r_id, member.guild)
  145.  
  146. #self._log("Role check - is role?", value=role, member=member)
  147.  
  148. if not role:
  149. # Doesn't exist - remove it
  150. temp_roles = self.settings.getUserStat(member, member.guild, "TempRoles")
  151. temp_roles.remove(temp_role)
  152. self._remove_task(task)
  153. return
  154. # We have a role - let's see if we still need to keep it
  155. c = temp_role["Cooldown"]
  156.  
  157. #self._log("Cooldown check - do we have a cooldown?", value=c, member=member)
  158.  
  159. if c == None:
  160. # We now have this role forever
  161. # One last check to make sure it all makes sense
  162. found = False
  163. temp_roles = self.settings.getUserStat(member, member.guild, "TempRoles")
  164. if not role in member.roles:
  165. temp_roles.remove(temp_role)
  166. self.settings.setUserStat(member, member.guild, "TempRoles", temp_roles)
  167. self._remove_task(task)
  168. return
  169. # We still have a cooldown
  170. timeleft = c-int(time.time())
  171.  
  172. #self._log("Time left:", value=timeleft, member=member)
  173.  
  174. if timeleft > 0:
  175. # Recalibrate
  176. self.loop_list.append(self.bot.loop.create_task(self.check_temp_roles(member, temp_role)))
  177. self._remove_task(task)
  178. return
  179. # Here - we're either past our cooldown, or who knows what else
  180.  
  181. #self._log("Past the cooldown - no time left - do we have the role?", value=(role in member.roles), member=member)
  182.  
  183. if role in member.roles:
  184. #self._log("Removing the role now - on time (supposedly)", member=member, value=role)
  185. # We have the role still - remove it
  186. self.settings.role.rem_roles(member, [role])
  187.  
  188. # Remove the entry from our user settings
  189. temp_roles = self.settings.getUserStat(member, member.guild, "TempRoles")
  190. if not temp_roles:
  191. temp_roles = []
  192. if temp_role in temp_roles:
  193. #self._log("Temp Role was in user settings - removing", member=member)
  194. temp_roles.remove(temp_role)
  195. self.settings.setUserStat(member, member.guild, "TempRoles", temp_roles)
  196.  
  197. # Check if we pm
  198. if self.settings.getServerStat(member.guild, "TempRolePM") and "AddedBy" in temp_role:
  199. try:
  200. await member.send("**{}** was removed from your roles in *{}*.".format(role.name, member.guild.name))
  201. except:
  202. pass
  203. self._remove_task(task)
  204.  
  205. @commands.command(pass_context=True)
  206. async def temppm(self, ctx, *, yes_no = None):
  207. """Sets whether to inform users that they've been given a temp role."""
  208.  
  209. # Check for admin status
  210. isAdmin = ctx.author.permissions_in(ctx.channel).administrator
  211. if not isAdmin:
  212. checkAdmin = self.settings.getServerStat(ctx.guild, "AdminArray")
  213. for role in ctx.author.roles:
  214. for aRole in checkAdmin:
  215. # Get the role that corresponds to the id
  216. if str(aRole['ID']) == str(role.id):
  217. isAdmin = True
  218. if not isAdmin:
  219. await ctx.send("You do not have permission to use this command.")
  220. return
  221.  
  222. setting_name = "Temp role pm"
  223. setting_val = "TempRolePM"
  224.  
  225. current = self.settings.getServerStat(ctx.guild, setting_val)
  226. if yes_no == None:
  227. if current:
  228. msg = "{} currently *enabled.*".format(setting_name)
  229. else:
  230. msg = "{} currently *disabled.*".format(setting_name)
  231. elif yes_no.lower() in [ "yes", "on", "true", "enabled", "enable" ]:
  232. yes_no = True
  233. if current == True:
  234. msg = '{} remains *enabled*.'.format(setting_name)
  235. else:
  236. msg = '{} is now *enabled*.'.format(setting_name)
  237. elif yes_no.lower() in [ "no", "off", "false", "disabled", "disable" ]:
  238. yes_no = False
  239. if current == False:
  240. msg = '{} remains *disabled*.'.format(setting_name)
  241. else:
  242. msg = '{} is now *disabled*.'.format(setting_name)
  243. else:
  244. msg = "That's not a valid setting."
  245. yes_no = current
  246. if not yes_no == None and not yes_no == current:
  247. self.settings.setServerStat(ctx.guild, setting_val, yes_no)
  248. await ctx.send(msg)
  249.  
  250. @commands.command(pass_context=True)
  251. async def autotemp(self, ctx, *, role = None):
  252. """Sets the temp role to apply to each new user that joins."""
  253. usage = 'Usage: `{}addtemprole [role]`'.format(ctx.prefix)
  254. # Check if we're suppressing @here and @everyone mentions
  255. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  256. suppress = True
  257. else:
  258. suppress = False
  259.  
  260. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  261. # Only allow admins to change server stats
  262. if not isAdmin:
  263. await ctx.message.channel.send('You do not have sufficient privileges to access this command.')
  264. return
  265.  
  266. if role == None:
  267. self.settings.setServerStat(ctx.guild, "TempRole", None)
  268. await ctx.send("Default temp role *removed*.")
  269. return
  270.  
  271. roleName = role
  272. role = DisplayName.roleForName(roleName, ctx.guild)
  273. if not role:
  274. msg = 'I couldn\'t find *{}*...'.format(roleName)
  275. # Check for suppress
  276. if suppress:
  277. msg = Nullify.clean(msg)
  278. await ctx.send(msg)
  279. return
  280.  
  281. self.settings.setServerStat(ctx.guild, "TempRole", role.id)
  282. role_time = self.settings.getServerStat(ctx.guild, "TempRoleTime")
  283.  
  284. msg = "**{}** is now the default temp role - will be active for *{}*.".format(role.name, ReadableTime.getReadableTimeBetween(0, role_time * 60))
  285. if suppress:
  286. msg = Nullify.clean(msg)
  287. await ctx.send(msg)
  288.  
  289. @commands.command(pass_context=True)
  290. async def getautotemp(self, ctx):
  291. """Gets the temp role applied to each new user that joins."""
  292. # Check if we're suppressing @here and @everyone mentions
  293. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  294. suppress = True
  295. else:
  296. suppress = False
  297.  
  298. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  299. # Only allow admins to change server stats
  300. if not isAdmin:
  301. await ctx.message.channel.send('You do not have sufficient privileges to access this command.')
  302. return
  303.  
  304. temp_id = self.settings.getServerStat(ctx.guild, "TempRole")
  305. if temp_id == None:
  306. # No temp setup
  307. await ctx.send("There is no default temp role.")
  308. return
  309.  
  310. temp_role = DisplayName.roleForName(temp_id, ctx.guild)
  311. if temp_role == None:
  312. # Not a role anymore
  313. await ctx.send("The default temp role ({}) no longer exists.".format(temp_id))
  314. return
  315. role_time = self.settings.getServerStat(ctx.guild, "TempRoleTime")
  316. msg = "**{}** is the default temp role - will be active for *{}*.".format(temp_role.name, ReadableTime.getReadableTimeBetween(0, role_time * 60))
  317. if suppress:
  318. msg = Nullify.clean(msg)
  319. await ctx.send(msg)
  320.  
  321. @commands.command(pass_context=True)
  322. async def temptime(self, ctx, *, minutes = None):
  323. """Sets the number of minutes for the temp role - must be greater than 0 (admin-only)."""
  324. # Check if we're suppressing @here and @everyone mentions
  325. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  326. suppress = True
  327. else:
  328. suppress = False
  329.  
  330. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  331. # Only allow admins to change server stats
  332. if not isAdmin:
  333. await ctx.message.channel.send('You do not have sufficient privileges to access this command.')
  334. return
  335.  
  336. try:
  337. minutes = int(minutes)
  338. except:
  339. await ctx.send("That's not a valid integer!")
  340. return
  341.  
  342. if minutes < 1:
  343. await ctx.send("Time must be greater than 0!")
  344. return
  345.  
  346. self.settings.setServerStat(ctx.guild, "TempRoleTime", minutes)
  347.  
  348. msg = "Temp role will last *{}*.".format(ReadableTime.getReadableTimeBetween(0, minutes*60))
  349. await ctx.send(msg)
  350.  
  351. @commands.command(pass_context=True)
  352. async def hastemp(self, ctx, *, member = None):
  353. """Displays any temp roles the passed user has, and the remaining time."""
  354. # Check for admin status
  355. isAdmin = ctx.author.permissions_in(ctx.channel).administrator
  356. if not isAdmin:
  357. checkAdmin = self.settings.getServerStat(ctx.guild, "AdminArray")
  358. for role in ctx.author.roles:
  359. for aRole in checkAdmin:
  360. # Get the role that corresponds to the id
  361. if str(aRole['ID']) == str(role.id):
  362. isAdmin = True
  363. if not isAdmin:
  364. await ctx.send("You do not have permission to use this command.")
  365. return
  366. # Check if we're suppressing @here and @everyone mentions
  367. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  368. suppress = True
  369. else:
  370. suppress = False
  371. # Get the array
  372. try:
  373. promoArray = self.settings.getServerStat(server, "TempRoleList")
  374. except Exception:
  375. promoArray = []
  376. if member == None:
  377. member = ctx.author
  378. else:
  379. member_name = member
  380. member = DisplayName.memberForName(member, ctx.guild)
  381. if not member:
  382. msg = 'I couldn\'t find *{}*...'.format(member_name)
  383. # Check for suppress
  384. if suppress:
  385. msg = Nullify.clean(msg)
  386. await ctx.send(msg)
  387. return
  388. # Got the member - let's check for roles
  389. temp_roles = self.settings.getUserStat(member, ctx.guild, "TempRoles")
  390. if not len(temp_roles):
  391. await ctx.send("*{}* has no logged temp roles!".format(DisplayName.name(member)))
  392. return
  393. roleText = "**__Current Temp Roles For {}:__**\n\n".format(DisplayName.name(member))
  394. c = time.time()
  395. for arole in temp_roles:
  396. # Get current role name based on id
  397. foundRole = False
  398. timeleft = arole["Cooldown"]-int(time.time())
  399. for role in ctx.guild.roles:
  400. if str(role.id) == str(arole['ID']):
  401. # We found it
  402. foundRole = True
  403. if not "AddedBy" in arole:
  404. added = "automatically"
  405. else:
  406. add_user = DisplayName.name(DisplayName.memberForID(arole["AddedBy"], ctx.guild))
  407. if not add_user:
  408. add_user = str(arole["AddedBy"])
  409. added = "by {}".format(add_user)
  410. roleText = '{}**{}** - added {} - *{}* remain\n'.format(roleText, role.name, added, ReadableTime.getReadableTimeBetween(0, timeleft))
  411. if not foundRole:
  412. roleText = '{}**{}** (removed from server)\n'.format(roleText, arole['Name'])
  413. # Check for suppress
  414. if suppress:
  415. roleText = Nullify.clean(roleText)
  416. await ctx.send(roleText)
  417.  
  418. @commands.command(pass_context=True)
  419. async def addtemprole(self, ctx, *, role : str = None):
  420. """Adds a new role to the temp role list (admin only)."""
  421. usage = 'Usage: `{}addtemprole [role]`'.format(ctx.prefix)
  422. # Check if we're suppressing @here and @everyone mentions
  423. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  424. suppress = True
  425. else:
  426. suppress = False
  427.  
  428. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  429. # Only allow admins to change server stats
  430. if not isAdmin:
  431. await ctx.message.channel.send('You do not have sufficient privileges to access this command.')
  432. return
  433.  
  434. if role == None:
  435. await ctx.message.channel.send(usage)
  436. return
  437.  
  438. roleName = role
  439. role = DisplayName.roleForName(roleName, ctx.guild)
  440. if not role:
  441. msg = 'I couldn\'t find *{}*...'.format(roleName)
  442. # Check for suppress
  443. if suppress:
  444. msg = Nullify.clean(msg)
  445. await ctx.send(msg)
  446. return
  447.  
  448. # Now we see if we already have that role in our list
  449. promoArray = self.settings.getServerStat(ctx.guild, "TempRoleList")
  450.  
  451. if role.id in [int(x["ID"]) for x in promoArray]:
  452. # We found it - throw an error message and return
  453. msg = '**{}** is already in the list.'.format(role.name)
  454. # Check for suppress
  455. if suppress:
  456. msg = Nullify.clean(msg)
  457. await ctx.send(msg)
  458. return
  459.  
  460. # If we made it this far - then we can add it
  461. promoArray.append({ 'ID' : role.id, 'Name' : role.name })
  462. self.settings.setServerStat(ctx.guild, "TempRoleList", promoArray)
  463.  
  464. msg = '**{}** added to list.'.format(role.name)
  465. # Check for suppress
  466. if suppress:
  467. msg = Nullify.clean(msg)
  468. await ctx.message.channel.send(msg)
  469. return
  470.  
  471. @commands.command(pass_context=True)
  472. async def removetemprole(self, ctx, *, role : str = None):
  473. """Removes a role from the temp role list (admin only)."""
  474. usage = 'Usage: `{}removetemprole [role]`'.format(ctx.prefix)
  475. # Check if we're suppressing @here and @everyone mentions
  476. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  477. suppress = True
  478. else:
  479. suppress = False
  480.  
  481. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  482. # Only allow admins to change server stats
  483. if not isAdmin:
  484. await ctx.message.channel.send('You do not have sufficient privileges to access this command.')
  485. return
  486.  
  487. if role == None:
  488. await ctx.message.channel.send(usage)
  489. return
  490.  
  491. roleName = role
  492. role = DisplayName.roleForName(roleName, ctx.guild)
  493. if not role:
  494. msg = 'I couldn\'t find *{}*...'.format(roleName)
  495. # Check for suppress
  496. if suppress:
  497. msg = Nullify.clean(msg)
  498. await ctx.send(msg)
  499. return
  500.  
  501. # Now we see if we already have that role in our list
  502. promoArray = self.settings.getServerStat(ctx.guild, "TempRoleList")
  503.  
  504. if role.id in [int(x["ID"]) for x in promoArray]:
  505. # We found it - throw an error message and return
  506. msg = '**{}** removed successfully.'.format(role.name)
  507. self.settings.setServerStat(ctx.guild, "TempRoleList", [x for x in promoArray if role.id != int(x["ID"])])
  508. # Check for suppress
  509. if suppress:
  510. msg = Nullify.clean(msg)
  511. await ctx.send(msg)
  512. return
  513.  
  514. msg = '**{}** not found in list.'.format(role.name)
  515. # Check for suppress
  516. if suppress:
  517. msg = Nullify.clean(msg)
  518. await ctx.send(msg)
  519. return
  520.  
  521. @commands.command(pass_context=True)
  522. async def listtemproles(self, ctx):
  523. """Lists all roles for the temp role system."""
  524.  
  525. server = ctx.message.guild
  526. channel = ctx.message.channel
  527.  
  528. # Check if we're suppressing @here and @everyone mentions
  529. if self.settings.getServerStat(server, "SuppressMentions"):
  530. suppress = True
  531. else:
  532. suppress = False
  533.  
  534. # Get the array
  535. try:
  536. promoArray = self.settings.getServerStat(server, "TempRoleList")
  537. except Exception:
  538. promoArray = []
  539. if promoArray == None:
  540. promoArray = []
  541.  
  542.  
  543. if not len(promoArray):
  544. msg = "There aren't any roles in the user role list yet. Add some with the `{}addtemprole` command!".format(ctx.prefix)
  545. await ctx.channel.send(msg)
  546. return
  547.  
  548. # Sort by XP first, then by name
  549. # promoSorted = sorted(promoArray, key=itemgetter('XP', 'Name'))
  550. promoSorted = sorted(promoArray, key=lambda x:x['Name'])
  551.  
  552. roleText = "**__Current Temp Roles:__**\n\n"
  553. for arole in promoSorted:
  554. # Get current role name based on id
  555. foundRole = False
  556. for role in server.roles:
  557. if str(role.id) == str(arole['ID']):
  558. # We found it
  559. foundRole = True
  560. roleText = '{}**{}**\n'.format(roleText, role.name)
  561. if not foundRole:
  562. roleText = '{}**{}** (removed from server)\n'.format(roleText, arole['Name'])
  563.  
  564. # Check for suppress
  565. if suppress:
  566. roleText = Nullify.clean(roleText)
  567.  
  568. await channel.send(roleText)
  569.  
  570. @commands.command(pass_context=True)
  571. async def untemp(self, ctx, member = None, role = None):
  572. """Removes the passed temp role from the passed user (bot-admin only)."""
  573. # Check if we're suppressing @here and @everyone mentions
  574. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  575. suppress = True
  576. else:
  577. suppress = False
  578.  
  579. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  580. if not isAdmin:
  581. checkAdmin = self.settings.getServerStat(ctx.message.guild, "AdminArray")
  582. for arole in ctx.message.author.roles:
  583. for aRole in checkAdmin:
  584. # Get the role that corresponds to the id
  585. if str(aRole['ID']) == str(arole.id):
  586. isAdmin = True
  587. # Only allow admins to change server stats
  588. if not isAdmin:
  589. await ctx.channel.send('You do not have sufficient privileges to access this command.')
  590. return
  591.  
  592. if member == None or role == None:
  593. msg = 'Usage: `{}untemp "[member]" "[role]"`'.format(ctx.prefix)
  594. await ctx.channel.send(msg)
  595. return
  596.  
  597. # Get member and role
  598. member_from_name = DisplayName.memberForName(member, ctx.guild)
  599. role_from_name = DisplayName.roleForName(role, ctx.guild)
  600.  
  601. if not member_from_name and not role_from_name:
  602. msg = "I couldn't find either the role or member..."
  603. await ctx.send(msg)
  604. return
  605.  
  606. if not member_from_name:
  607. msg = 'I couldn\'t find *{}*...'.format(member)
  608. # Check for suppress
  609. if suppress:
  610. msg = Nullify.clean(msg)
  611. await ctx.send(msg)
  612. return
  613.  
  614. if not role_from_name:
  615. msg = 'I couldn\'t find *{}*...'.format(role)
  616. # Check for suppress
  617. if suppress:
  618. msg = Nullify.clean(msg)
  619. await ctx.send(msg)
  620. return
  621.  
  622. # Make sure our role is in the list
  623. promoArray = self.settings.getServerStat(ctx.guild, "TempRoleList")
  624. if not role_from_name.id in [int(x["ID"]) for x in promoArray]:
  625. # No dice
  626. await ctx.send("That role is not in the temp role list!")
  627. return
  628.  
  629. # Check if the user has that role - and remove it
  630. if not role_from_name in member_from_name.roles:
  631. # Don't have it
  632. await ctx.send("That user doesn't have that role!")
  633. return
  634.  
  635. message = await ctx.send("Applying...")
  636. # We should be able to remove it now
  637. self.settings.role.rem_roles(member_from_name, [role_from_name])
  638.  
  639. user_roles = self.settings.getUserStat(member_from_name, ctx.guild, "TempRoles")
  640. for r in user_roles:
  641. if int(r["ID"]) == role_from_name.id:
  642. user_roles.remove(r)
  643. self.settings.setUserStat(member_from_name, ctx.guild, "TempRoles", user_roles)
  644. break
  645.  
  646. msg = "*{}* was removed from **{}**.".format(
  647. DisplayName.name(member_from_name),
  648. role_from_name.name
  649. )
  650. # Announce it
  651. if suppress:
  652. msg = Nullify.clean(msg)
  653. await message.edit(content=msg)
  654. # Check if we pm
  655. if self.settings.getServerStat(ctx.guild, "TempRolePM"):
  656. try:
  657. await member_from_name.send("**{}** was removed from your roles in *{}*.".format(role_from_name.name, ctx.guild.name))
  658. except:
  659. pass
  660.  
  661.  
  662. @commands.command(pass_context=True)
  663. async def temp(self, ctx, member = None, role = None, *, cooldown = None):
  664. """Gives the passed member the temporary role for the passed amount of time - needs quotes around member and role (bot-admin only)."""
  665. # Check if we're suppressing @here and @everyone mentions
  666. if self.settings.getServerStat(ctx.message.guild, "SuppressMentions"):
  667. suppress = True
  668. else:
  669. suppress = False
  670.  
  671. isAdmin = ctx.message.author.permissions_in(ctx.message.channel).administrator
  672. if not isAdmin:
  673. checkAdmin = self.settings.getServerStat(ctx.message.guild, "AdminArray")
  674. for arole in ctx.message.author.roles:
  675. for aRole in checkAdmin:
  676. # Get the role that corresponds to the id
  677. if str(aRole['ID']) == str(arole.id):
  678. isAdmin = True
  679. # Only allow admins to change server stats
  680. if not isAdmin:
  681. await ctx.channel.send('You do not have sufficient privileges to access this command.')
  682. return
  683.  
  684. if member == None or role == None:
  685. msg = 'Usage: `{}temp "[member]" "[role]" [cooldown]`'.format(ctx.prefix)
  686. await ctx.channel.send(msg)
  687. return
  688.  
  689. # Get member and role
  690. member_from_name = DisplayName.memberForName(member, ctx.guild)
  691. role_from_name = DisplayName.roleForName(role, ctx.guild)
  692.  
  693. if not member_from_name and not role_from_name:
  694. msg = "I couldn't find either the role or member..."
  695. await ctx.send(msg)
  696. return
  697.  
  698. if not member_from_name:
  699. msg = 'I couldn\'t find *{}*...'.format(member)
  700. # Check for suppress
  701. if suppress:
  702. msg = Nullify.clean(msg)
  703. await ctx.send(msg)
  704. return
  705.  
  706. # Don't allow us to temp admins or bot admins
  707. isAdmin = member_from_name.permissions_in(ctx.channel).administrator
  708. if not isAdmin:
  709. checkAdmin = self.settings.getServerStat(ctx.guild, "AdminArray")
  710. for arole in member_from_name.roles:
  711. for aRole in checkAdmin:
  712. # Get the role that corresponds to the id
  713. if str(aRole['ID']) == str(arole.id):
  714. isAdmin = True
  715. # Only allow admins to change server stats
  716. if isAdmin:
  717. await ctx.channel.send("You can't apply temp roles to other admins or bot-admins.")
  718. return
  719.  
  720. if not role_from_name:
  721. msg = 'I couldn\'t find *{}*...'.format(role)
  722. # Check for suppress
  723. if suppress:
  724. msg = Nullify.clean(msg)
  725. await ctx.send(msg)
  726. return
  727.  
  728. # Make sure our role is in the list
  729. promoArray = self.settings.getServerStat(ctx.guild, "TempRoleList")
  730. if not role_from_name.id in [int(x["ID"]) for x in promoArray]:
  731. # No dice
  732. await ctx.send("That role is not in the temp role list!")
  733. return
  734.  
  735. if cooldown == None:
  736. await ctx.send("You must specify a time greater than 0 seconds.")
  737. return
  738.  
  739. if not cooldown == None:
  740. # Get the end time
  741. end_time = None
  742. try:
  743. # Get current time - and end time
  744. currentTime = int(time.time())
  745. cal = parsedatetime.Calendar()
  746. time_struct, parse_status = cal.parse(cooldown)
  747. start = datetime(*time_struct[:6])
  748. end = time.mktime(start.timetuple())
  749. # Get the time from now to end time
  750. end_time = end-currentTime
  751. except:
  752. pass
  753. if end_time == None:
  754. # We didn't get a time
  755. await ctx.send("That time value is invalid.")
  756. return
  757. # Set the cooldown
  758. cooldown = end_time
  759.  
  760. if cooldown < 1:
  761. await ctx.send("You must specify a time greater than 0 seconds.")
  762. return
  763.  
  764. message = await ctx.send("Applying...")
  765.  
  766. # Here we have a member, role, and end time - apply them!
  767. user_roles = self.settings.getUserStat(member_from_name, ctx.guild, "TempRoles")
  768. # Check and see if we're overriding a current time
  769. found = False
  770. temp_role = {}
  771. for r in user_roles:
  772. if int(r["ID"]) == role_from_name.id:
  773. # Already have it - update the cooldown
  774. r["Cooldown"] = cooldown + int(time.time()) if cooldown != None else cooldown
  775. r["AddedBy"] = ctx.author.id
  776. temp_role = r
  777. found = True
  778. break
  779. if not found:
  780. # Add it anew
  781. temp_role["ID"] = role_from_name.id
  782. temp_role["Cooldown"] = cooldown + int(time.time()) if cooldown != None else cooldown
  783. temp_role["AddedBy"] = ctx.author.id
  784. user_roles.append(temp_role)
  785. self.settings.setUserStat(member_from_name, ctx.guild, "TempRoles", user_roles)
  786. if not role_from_name in member_from_name.roles:
  787. self.settings.role.add_roles(member_from_name, [role_from_name])
  788. if not cooldown == None:
  789. # We have a cooldown
  790. msg = "*{}* has been given **{}** for *{}*.".format(
  791. DisplayName.name(member_from_name),
  792. role_from_name.name,
  793. ReadableTime.getReadableTimeBetween(0, cooldown)
  794. )
  795. pm = "You have been given **{}** in *{}* for *{}*".format(
  796. role_from_name.name,
  797. ctx.guild.name,
  798. ReadableTime.getReadableTimeBetween(0, cooldown)
  799. )
  800. self.loop_list.append(self.bot.loop.create_task(self.check_temp_roles(member_from_name, temp_role)))
  801. else:
  802. msg = "*{}* has been given **{}** *until further notice*.".format(
  803. DisplayName.name(member_from_name),
  804. role_from_name.name
  805. )
  806. pm = "You have been given **{}** in *{} until further notice*.".format(
  807. role_from_name.name,
  808. ctx.guild.name
  809. )
  810. # Announce it
  811. if suppress:
  812. msg = Nullify.clean(msg)
  813. await message.edit(content=msg)
  814. # Check if we pm
  815. if self.settings.getServerStat(ctx.guild, "TempRolePM"):
  816. try:
  817. await member_from_name.send(pm)
  818. except:
  819. pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement