import argparse import asyncio import copy import datetime import json import logging import shlex import traceback import discord import pytz from discord.ext import commands from utils.misc import CustomFormatter from .poll import Poll from utils.paginator import embed_list_paginated from essentials.multi_server import get_server_pre, ask_for_server, ask_for_channel from essentials.settings import SETTINGS from utils.poll_name_generator import generate_word from essentials.exceptions import StopWizard class PollControls: def __init__(self, bot): self.bot = bot self.bot.loop.create_task(self.refresh_polls()) self.ignore_next_removed_reaction = {} # General Methods async def refresh_polls(self): """This function runs every 5 seconds to refresh poll messages when needed""" while True: try: for i in range(self.bot.poll_refresh_q.qsize()): values = await self.bot.poll_refresh_q.get() if values.get('lock') and not values.get('lock')._waiters: p = await Poll.load_from_db(self.bot, str(values.get('sid')), values.get('label')) if p: await self.bot.edit_message(values.get('msg'), embed=await p.generate_embed()) self.bot.poll_refresh_q.task_done() else: await self.bot.poll_refresh_q.put_unique_id(values) except AttributeError: pass await asyncio.sleep(5) def get_lock(self, server_id): if not self.bot.locks.get(str(server_id)): self.bot.locks[server_id] = asyncio.Lock() return self.bot.locks.get(str(server_id)) async def is_admin_or_creator(self, ctx, server, owner_id, error_msg=None): member = server.get_member(ctx.message.author.id) if member.id == owner_id: return True elif member.server_permissions.manage_server: return True else: result = await self.bot.db.config.find_one({'_id': str(server.id)}) if result and result.get('admin_role') in [r.name for r in member.roles]: return True else: if error_msg is not None: await self.bot.send_message(ctx.message.author, error_msg) return False async def say_error(self, ctx, error_text, footer_text=None): embed = discord.Embed(title='', description=error_text, colour=SETTINGS.color) embed.set_author(name='Error', icon_url=SETTINGS.author_icon) if footer_text is not None: embed.set_footer(text=footer_text) await self.bot.say(embed=embed) async def say_embed(self, ctx, say_text='', title='Pollmaster', footer_text=None): embed = discord.Embed(title='', description=say_text, colour=SETTINGS.color) embed.set_author(name=title, icon_url=SETTINGS.author_icon) if footer_text is not None: embed.set_footer(text=footer_text) await self.bot.say(embed=embed) # Commands @commands.command(pass_context=True) async def activate(self, ctx, *, short=None): """Activate a prepared poll. Parameter: