add providers
This commit is contained in:
parent
d00aadd82f
commit
fdc9c9196d
7 changed files with 86 additions and 96 deletions
154
cogs/poll.py
154
cogs/poll.py
|
@ -2,13 +2,12 @@ import json
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
import bcrypt
|
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from yarl import URL
|
from yarl import URL
|
||||||
|
|
||||||
from bot import TuxBot
|
from bot import TuxBot
|
||||||
from .utils.lang import Texts
|
from .utils.lang import Texts
|
||||||
from .utils.models import Poll
|
from .utils.models import Poll, Responses
|
||||||
from .utils import emotes as utils_emotes
|
from .utils import emotes as utils_emotes
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,7 +24,7 @@ class Polls(commands.Cog):
|
||||||
|
|
||||||
if poll.count() != 0:
|
if poll.count() != 0:
|
||||||
poll = poll.one()
|
poll = poll.one()
|
||||||
emotes = utils_emotes.get(len(poll.responses))
|
emotes = utils_emotes.get(len(poll.choice))
|
||||||
|
|
||||||
if pld.emoji.name in emotes:
|
if pld.emoji.name in emotes:
|
||||||
return poll
|
return poll
|
||||||
|
@ -39,6 +38,73 @@ class Polls(commands.Cog):
|
||||||
|
|
||||||
await message.remove_reaction(pld.emoji.name, user)
|
await message.remove_reaction(pld.emoji.name, user)
|
||||||
|
|
||||||
|
@commands.Cog.listener()
|
||||||
|
async def on_raw_reaction_add(self, pld: discord.RawReactionActionEvent):
|
||||||
|
poll = self.get_poll(pld)
|
||||||
|
|
||||||
|
if poll:
|
||||||
|
if poll.is_anonymous:
|
||||||
|
try:
|
||||||
|
await self.remove_reaction(pld)
|
||||||
|
except discord.errors.Forbidden:
|
||||||
|
pass
|
||||||
|
choice = utils_emotes.get_index(pld.emoji.name)
|
||||||
|
|
||||||
|
response = self.bot.database.session.query(Poll) \
|
||||||
|
.filter(
|
||||||
|
Responses.poll_id == poll.id,
|
||||||
|
Responses.user == pld.user_id,
|
||||||
|
Responses.choice == choice
|
||||||
|
)
|
||||||
|
if response.count() != 0:
|
||||||
|
response = response.one()
|
||||||
|
self.bot.database.session.delete(response)
|
||||||
|
else:
|
||||||
|
response = Responses(
|
||||||
|
user=pld.user_id,
|
||||||
|
poll_id=poll.id,
|
||||||
|
choice=choice
|
||||||
|
)
|
||||||
|
self.bot.database.session.add(response)
|
||||||
|
self.bot.database.session.commit()
|
||||||
|
|
||||||
|
"""---------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
async def create_poll(self, ctx: commands.Context, poll: str, anonymous):
|
||||||
|
question = (poll.split('|')[0]).strip()
|
||||||
|
responses = [response.strip() for response in poll.split('|')[1:]]
|
||||||
|
emotes = utils_emotes.get(len(responses))
|
||||||
|
|
||||||
|
stmt = await ctx.send(Texts('poll', ctx).get('**Preparation...**'))
|
||||||
|
|
||||||
|
poll_row = Poll()
|
||||||
|
self.bot.database.session.add(poll_row)
|
||||||
|
self.bot.database.session.flush()
|
||||||
|
|
||||||
|
e = discord.Embed(description=f"**{question}**")
|
||||||
|
e.set_author(
|
||||||
|
name=self.bot.user if anonymous else ctx.author,
|
||||||
|
icon_url="https://cdn.gnous.eu/tuxbot/survey1.png"
|
||||||
|
)
|
||||||
|
for i, response in enumerate(responses):
|
||||||
|
e.add_field(
|
||||||
|
name=f"{emotes[i]} __{response.capitalize()}__",
|
||||||
|
value="**0** vote"
|
||||||
|
)
|
||||||
|
e.set_footer(text=f"ID: {poll_row.id}")
|
||||||
|
|
||||||
|
poll_row.channel_id = stmt.channel.id
|
||||||
|
poll_row.message_id = stmt.id
|
||||||
|
poll_row.content = e.to_dict()
|
||||||
|
poll_row.is_anonymous = anonymous
|
||||||
|
poll_row.available_choices = len(responses)
|
||||||
|
|
||||||
|
self.bot.database.session.commit()
|
||||||
|
|
||||||
|
await stmt.edit(content='', embed=e)
|
||||||
|
for emote in range(len(responses)):
|
||||||
|
await stmt.add_reaction(emotes[emote])
|
||||||
|
|
||||||
async def update_poll(self, poll_id: int):
|
async def update_poll(self, poll_id: int):
|
||||||
poll = self.bot.database.session \
|
poll = self.bot.database.session \
|
||||||
.query(Poll) \
|
.query(Poll) \
|
||||||
|
@ -102,86 +168,6 @@ class Polls(commands.Cog):
|
||||||
poll.content = json.dumps(content)
|
poll.content = json.dumps(content)
|
||||||
self.bot.database.session.commit()
|
self.bot.database.session.commit()
|
||||||
|
|
||||||
@commands.Cog.listener()
|
|
||||||
async def on_raw_reaction_add(self, pld: discord.RawReactionActionEvent):
|
|
||||||
poll = self.get_poll(pld)
|
|
||||||
|
|
||||||
if poll:
|
|
||||||
if poll.is_anonymous:
|
|
||||||
try:
|
|
||||||
await self.remove_reaction(pld)
|
|
||||||
except discord.errors.Forbidden:
|
|
||||||
pass
|
|
||||||
|
|
||||||
user_id = str(pld.user_id).encode()
|
|
||||||
|
|
||||||
choice = utils_emotes.get_index(pld.emoji.name) + 1
|
|
||||||
responses = json.loads(poll.responses) \
|
|
||||||
if isinstance(poll.responses, str) \
|
|
||||||
else poll.responses
|
|
||||||
|
|
||||||
if not responses.get(str(choice)):
|
|
||||||
user_id_hash = bcrypt.hashpw(user_id, bcrypt.gensalt())
|
|
||||||
responses \
|
|
||||||
.get(str(choice)) \
|
|
||||||
.append(user_id_hash.decode())
|
|
||||||
else:
|
|
||||||
for i, responder in enumerate(responses.get(str(choice))):
|
|
||||||
if bcrypt.checkpw(user_id, responder.encode()):
|
|
||||||
responses \
|
|
||||||
.get(str(choice)) \
|
|
||||||
.pop(i)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
user_id_hash = bcrypt.hashpw(user_id, bcrypt.gensalt())
|
|
||||||
responses \
|
|
||||||
.get(str(choice)) \
|
|
||||||
.append(user_id_hash.decode())
|
|
||||||
break
|
|
||||||
|
|
||||||
poll.responses = json.dumps(responses)
|
|
||||||
self.bot.database.session.commit()
|
|
||||||
await self.update_poll(poll.id)
|
|
||||||
|
|
||||||
"""---------------------------------------------------------------------"""
|
|
||||||
|
|
||||||
async def make_poll(self, ctx: commands.Context, poll: str, anonymous):
|
|
||||||
question = (poll.split('|')[0]).strip()
|
|
||||||
responses = [response.strip() for response in poll.split('|')[1:]]
|
|
||||||
responses_row = {}
|
|
||||||
emotes = utils_emotes.get(len(responses))
|
|
||||||
|
|
||||||
stmt = await ctx.send(Texts('poll', ctx).get('**Preparation...**'))
|
|
||||||
|
|
||||||
poll_row = Poll()
|
|
||||||
self.bot.database.session.add(poll_row)
|
|
||||||
self.bot.database.session.flush()
|
|
||||||
|
|
||||||
e = discord.Embed(description=f"**{question}**")
|
|
||||||
e.set_author(
|
|
||||||
name=self.bot.user if anonymous else ctx.author,
|
|
||||||
icon_url="https://cdn.gnous.eu/tuxbot/survey1.png"
|
|
||||||
)
|
|
||||||
for i, response in enumerate(responses):
|
|
||||||
responses_row[str(i + 1)] = []
|
|
||||||
e.add_field(
|
|
||||||
name=f"{emotes[i]} __{response.capitalize()}__",
|
|
||||||
value="**0** vote"
|
|
||||||
)
|
|
||||||
e.set_footer(text=f"ID: {poll_row.id}")
|
|
||||||
|
|
||||||
poll_row.message_id = stmt.id
|
|
||||||
poll_row.channel_id = stmt.channel.id
|
|
||||||
poll_row.content = e.to_dict()
|
|
||||||
poll_row.is_anonymous = anonymous
|
|
||||||
poll_row.responses = responses_row
|
|
||||||
|
|
||||||
self.bot.database.session.commit()
|
|
||||||
|
|
||||||
await stmt.edit(content='', embed=e)
|
|
||||||
for emote in range(len(responses)):
|
|
||||||
await stmt.add_reaction(emotes[emote])
|
|
||||||
|
|
||||||
@commands.group(name='sondage', aliases=['poll'])
|
@commands.group(name='sondage', aliases=['poll'])
|
||||||
async def _poll(self, ctx: commands.Context):
|
async def _poll(self, ctx: commands.Context):
|
||||||
if ctx.invoked_subcommand is None:
|
if ctx.invoked_subcommand is None:
|
||||||
|
@ -192,7 +178,7 @@ class Polls(commands.Cog):
|
||||||
is_anonymous = '--anonyme' in poll
|
is_anonymous = '--anonyme' in poll
|
||||||
poll = poll.replace('--anonyme', '')
|
poll = poll.replace('--anonyme', '')
|
||||||
|
|
||||||
await self.make_poll(ctx, poll, anonymous=is_anonymous)
|
await self.create_poll(ctx, poll, anonymous=is_anonymous)
|
||||||
|
|
||||||
|
|
||||||
def setup(bot: TuxBot):
|
def setup(bot: TuxBot):
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
emotes = ['1⃣', '2⃣', '3⃣', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣', '🔟', '0⃣',
|
emotes = ['1⃣', '2⃣', '3⃣', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣', '🔟', '0⃣',
|
||||||
'🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮']
|
'🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮']
|
||||||
|
|
||||||
|
|
||||||
def get(count):
|
def get(count):
|
||||||
|
@ -7,4 +7,4 @@ def get(count):
|
||||||
|
|
||||||
|
|
||||||
def get_index(emote):
|
def get_index(emote):
|
||||||
return emotes.index(emote)
|
return emotes.index(emote)
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
from .lang import Lang
|
from .lang import Lang
|
||||||
from .warn import Warn
|
from .warn import Warn
|
||||||
from .poll import Poll
|
from .poll import Poll, Responses
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy import Column, Integer, Text, BigInteger, JSON, ForeignKey
|
from sqlalchemy import Column, Integer, BigInteger, JSON, ForeignKey, Boolean
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
|
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
|
@ -13,7 +14,9 @@ class Poll(Base):
|
||||||
message_id = Column(BigInteger)
|
message_id = Column(BigInteger)
|
||||||
|
|
||||||
content = Column(JSON)
|
content = Column(JSON)
|
||||||
|
is_anonymous = Column(Boolean)
|
||||||
|
|
||||||
|
available_choices = Column(Integer)
|
||||||
choice = relationship("Responses")
|
choice = relationship("Responses")
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,7 +24,7 @@ class Responses(Base):
|
||||||
__tablename__ = 'responses'
|
__tablename__ = 'responses'
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
user = Column(Text)
|
user = Column(BigInteger)
|
||||||
|
|
||||||
poll_id = Column(Integer, ForeignKey('polls.id'))
|
poll_id = Column(Integer, ForeignKey('polls.id'))
|
||||||
choice = Column(Integer)
|
choice = Column(Integer)
|
||||||
|
|
1
output.txt
Normal file
1
output.txt
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"280805240977227776": [
|
"280805240977227776": [
|
||||||
"b!"
|
"b!!"
|
||||||
],
|
],
|
||||||
"303633056944881686": [
|
"303633056944881686": [
|
||||||
"b!"
|
"b!!"
|
||||||
],
|
],
|
||||||
"336642139381301249": [
|
"336642139381301249": [
|
||||||
"b!"
|
"b!!"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,11 @@ discord.py[voice]
|
||||||
jishaku
|
jishaku
|
||||||
lxml
|
lxml
|
||||||
click
|
click
|
||||||
asyncpg>=0.12.0
|
asyncpg
|
||||||
sqlalchemy
|
sqlalchemy
|
||||||
gitpython
|
gitpython
|
||||||
requests
|
requests
|
||||||
psutil
|
psutil
|
||||||
bcrypt
|
werkzeug
|
||||||
tcp_latency
|
tcp_latency
|
||||||
yarl
|
yarl
|
||||||
|
|
Loading…
Reference in a new issue