token env
This commit is contained in:
parent
93818a3dc1
commit
637ffd313c
@ -1,6 +1,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import os
|
||||||
from typing import TypedDict
|
from typing import TypedDict
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
@ -17,7 +18,7 @@ from v6d2ctx.serve import *
|
|||||||
|
|
||||||
loop = asyncio.new_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
asyncio.set_event_loop(loop)
|
asyncio.set_event_loop(loop)
|
||||||
token = loop.run_until_complete(request_token("vote", "token"))
|
token = os.getenv("DISCORD_TOKEN", "unset")
|
||||||
client = discord.Client(
|
client = discord.Client(
|
||||||
intents=discord.Intents(
|
intents=discord.Intents(
|
||||||
members=True,
|
members=True,
|
||||||
@ -73,7 +74,9 @@ class Poll:
|
|||||||
self.message = message
|
self.message = message
|
||||||
self.votes = votes
|
self.votes = votes
|
||||||
self.emojis = emojis
|
self.emojis = emojis
|
||||||
self.reverse: dict[str, str] = {emoji: option for option, emoji in emojis.items()}
|
self.reverse: dict[str, str] = {
|
||||||
|
emoji: option for option, emoji in emojis.items()
|
||||||
|
}
|
||||||
self.options = options
|
self.options = options
|
||||||
self.title = title
|
self.title = title
|
||||||
|
|
||||||
@ -90,7 +93,8 @@ class Poll:
|
|||||||
for _, option in self.votes.items():
|
for _, option in self.votes.items():
|
||||||
count[option] = count.get(option, 0) + 1
|
count[option] = count.get(option, 0) + 1
|
||||||
return f"{self.title}\n" + "\n".join(
|
return f"{self.title}\n" + "\n".join(
|
||||||
f"{self.emojis[option]} `{count.get(option, 0)}` {option}" for option in self.options
|
f"{self.emojis[option]} `{count.get(option, 0)}` {option}"
|
||||||
|
for option in self.options
|
||||||
)
|
)
|
||||||
|
|
||||||
async def save(self):
|
async def save(self):
|
||||||
@ -99,7 +103,11 @@ class Poll:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def create(
|
async def create(
|
||||||
cls, ctx: Context, options: list[tuple[str, discord.Emoji | str]], title: str, votes: dict[discord.Member, str]
|
cls,
|
||||||
|
ctx: Context,
|
||||||
|
options: list[tuple[str, discord.Emoji | str]],
|
||||||
|
title: str,
|
||||||
|
votes: dict[discord.Member, str],
|
||||||
):
|
):
|
||||||
message: discord.Message = await ctx.channel.send("creating poll...")
|
message: discord.Message = await ctx.channel.send("creating poll...")
|
||||||
async with lock_for(message, "failed to create poll"):
|
async with lock_for(message, "failed to create poll"):
|
||||||
@ -120,11 +128,16 @@ class Poll:
|
|||||||
await ctx.message.delete()
|
await ctx.message.delete()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def load_votes(guild: discord.Guild, votes: dict[str, str]) -> dict[discord.Member, str]:
|
async def load_votes(
|
||||||
|
guild: discord.Guild, votes: dict[str, str]
|
||||||
|
) -> dict[discord.Member, str]:
|
||||||
loaded: dict[discord.Member, str] = {}
|
loaded: dict[discord.Member, str] = {}
|
||||||
for member, option in votes.items():
|
for member, option in votes.items():
|
||||||
try:
|
try:
|
||||||
loaded[guild.get_member(int(member)) or await guild.fetch_member(int(member))] = option
|
loaded[
|
||||||
|
guild.get_member(int(member))
|
||||||
|
or await guild.fetch_member(int(member))
|
||||||
|
] = option
|
||||||
except (ValueError, discord.HTTPException):
|
except (ValueError, discord.HTTPException):
|
||||||
pass
|
pass
|
||||||
return loaded
|
return loaded
|
||||||
@ -159,7 +172,9 @@ class Poll:
|
|||||||
def schedule_save(self) -> asyncio.Future[None]:
|
def schedule_save(self) -> asyncio.Future[None]:
|
||||||
vote_db.set_nowait(self.message.id, self.saved())
|
vote_db.set_nowait(self.message.id, self.saved())
|
||||||
if self.message.id not in self.tasks:
|
if self.message.id not in self.tasks:
|
||||||
self.tasks[self.message.id] = asyncio.create_task(self._scheduled_save(self.message))
|
self.tasks[self.message.id] = asyncio.create_task(
|
||||||
|
self._scheduled_save(self.message)
|
||||||
|
)
|
||||||
return self.tasks[self.message.id]
|
return self.tasks[self.message.id]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -169,7 +184,9 @@ class Poll:
|
|||||||
return
|
return
|
||||||
assert rrae.guild_id is not None
|
assert rrae.guild_id is not None
|
||||||
assert rrae.channel_id is not None
|
assert rrae.channel_id is not None
|
||||||
guild: discord.Guild = client.get_guild(rrae.guild_id) or await client.fetch_guild(rrae.guild_id)
|
guild: discord.Guild = client.get_guild(
|
||||||
|
rrae.guild_id
|
||||||
|
) or await client.fetch_guild(rrae.guild_id)
|
||||||
_channel = guild.get_channel(rrae.channel_id)
|
_channel = guild.get_channel(rrae.channel_id)
|
||||||
assert isinstance(_channel, discord.TextChannel)
|
assert isinstance(_channel, discord.TextChannel)
|
||||||
channel: discord.TextChannel = _channel
|
channel: discord.TextChannel = _channel
|
||||||
@ -182,14 +199,18 @@ class Poll:
|
|||||||
poll = await cls.load(message)
|
poll = await cls.load(message)
|
||||||
if poll is None:
|
if poll is None:
|
||||||
return
|
return
|
||||||
member: discord.Member = guild.get_member(rrae.user_id) or await guild.fetch_member(rrae.user_id)
|
member: discord.Member = guild.get_member(
|
||||||
|
rrae.user_id
|
||||||
|
) or await guild.fetch_member(rrae.user_id)
|
||||||
print("processing", rrae.emoji, rrae.event_type)
|
print("processing", rrae.emoji, rrae.event_type)
|
||||||
await poll.vote(member, rrae.emoji, rrae.event_type == "REACTION_REMOVE")
|
await poll.vote(member, rrae.emoji, rrae.event_type == "REACTION_REMOVE")
|
||||||
print("processed ", rrae.emoji, rrae.event_type)
|
print("processed ", rrae.emoji, rrae.event_type)
|
||||||
future = poll.schedule_save()
|
future = poll.schedule_save()
|
||||||
await future
|
await future
|
||||||
|
|
||||||
async def vote(self, member: discord.Member, emoji: discord.PartialEmoji | str, remove: bool):
|
async def vote(
|
||||||
|
self, member: discord.Member, emoji: discord.PartialEmoji | str, remove: bool
|
||||||
|
):
|
||||||
if str(emoji) in self.reverse:
|
if str(emoji) in self.reverse:
|
||||||
option = self.reverse[str(emoji)]
|
option = self.reverse[str(emoji)]
|
||||||
if remove:
|
if remove:
|
||||||
@ -210,7 +231,15 @@ async def poll_options(args: list[str]) -> list[tuple[str, discord.Emoji | str]]
|
|||||||
if "<" in emoji and ">" in emoji:
|
if "<" in emoji and ">" in emoji:
|
||||||
try:
|
try:
|
||||||
emoji = (
|
emoji = (
|
||||||
client.get_emoji(int("".join(c for c in emoji.rsplit(":", 1)[-1] if c.isdecimal())))
|
client.get_emoji(
|
||||||
|
int(
|
||||||
|
"".join(
|
||||||
|
c
|
||||||
|
for c in emoji.rsplit(":", 1)[-1]
|
||||||
|
if c.isdecimal()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
or emoji
|
or emoji
|
||||||
)
|
)
|
||||||
except (discord.NotFound, ValueError):
|
except (discord.NotFound, ValueError):
|
||||||
|
Loading…
Reference in New Issue
Block a user