Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
# PY VENV
venv/

# Tokens and Passwwords
essentials/secrets\.py

*.log

# export
Expand All @@ -16,4 +13,6 @@ export/*.txt
*.pyc

#backup
backup/
backup/

node_modules/
2 changes: 1 addition & 1 deletion cogs/help.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def get_help_embed(self, page, pre):
title = f' Pollmaster Help - React with an emoji to learn more about a topic!'
embed = discord.Embed(title='', description='', colour=SETTINGS.color)
embed.set_author(name=title, icon_url=SETTINGS.author_icon)
embed.set_footer(text='Use reactions to navigate the help. This message will self-destruct in 5 minutes.')
embed.set_footer(text='Use reactions to navigate the help. This message will self-destruct in 5 minutes')

if page == '🏠':
# POLL CREATION SHORT
Expand Down
80 changes: 76 additions & 4 deletions cogs/poll_controls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import random
import shlex
import time
import os
import requests
from string import ascii_lowercase

import discord
Expand All @@ -15,7 +17,7 @@
from essentials.multi_server import get_server_pre, ask_for_server, ask_for_channel
from essentials.settings import SETTINGS
from models.poll import Poll
from utils.misc import CustomFormatter
from utils.misc import CustomFormatter, proceed_to_party
from utils.paginator import embed_list_paginated
from utils.poll_name_generator import generate_word

Expand All @@ -40,6 +42,8 @@ def cog_unload(self):
# noinspection PyCallingNonCallable
@tasks.loop(seconds=30)
async def close_activate_polls(self):
if not proceed_to_party():
return
if hasattr(self.bot, 'db') and hasattr(self.bot.db, 'polls'):
utc_now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)

Expand Down Expand Up @@ -111,11 +115,15 @@ async def close_activate_polls(self):

@close_activate_polls.before_loop
async def before_close_activate_polls(self):
if not proceed_to_party():
return
# print('close task waiting...')
await self.bot.wait_until_ready()

@tasks.loop(seconds=5)
async def refresh_queue(self):
if not proceed_to_party():
return
remove_list = []
for pid, t in self.bot.refresh_blocked.items():
if t - time.time() < 0:
Expand All @@ -135,6 +143,8 @@ async def refresh_queue(self):

@refresh_queue.before_loop
async def before_refresh_queue(self):
if not proceed_to_party():
return
# print('refresh task waiting...')
await self.bot.wait_until_ready()

Expand Down Expand Up @@ -193,6 +203,8 @@ async def say_embed(self, ctx, say_text='', title='Pollmaster', footer_text=None

@commands.command()
async def activate(self, ctx, *, short=None):
if not proceed_to_party():
return
"""Activate a prepared poll. Parameter: <label>"""
server = await ask_for_server(self.bot, ctx.message, short)
if not server:
Expand Down Expand Up @@ -230,6 +242,8 @@ async def activate(self, ctx, *, short=None):

@commands.command()
async def delete(self, ctx, *, short=None):
if not proceed_to_party():
return
"""Delete a poll. Parameter: <label>"""
server = await ask_for_server(self.bot, ctx.message, short)
if not server:
Expand Down Expand Up @@ -269,6 +283,8 @@ async def delete(self, ctx, *, short=None):

@commands.command()
async def close(self, ctx, *, short=None):
if not proceed_to_party():
return
"""Close a poll. Parameter: <label>"""
server = await ask_for_server(self.bot, ctx.message, short)
if not server:
Expand Down Expand Up @@ -303,6 +319,8 @@ async def close(self, ctx, *, short=None):

@commands.command()
async def copy(self, ctx, *, short=None):
if not proceed_to_party():
return
"""Copy a poll. Parameter: <label>"""
server = await ask_for_server(self.bot, ctx.message, short)
if not server:
Expand All @@ -328,6 +346,8 @@ async def copy(self, ctx, *, short=None):

@commands.command()
async def export(self, ctx, *, short=None):
if not proceed_to_party():
return
"""Export a poll. Parameter: <label>"""
server = await ask_for_server(self.bot, ctx.message, short)
if not server:
Expand Down Expand Up @@ -370,6 +390,8 @@ async def export(self, ctx, *, short=None):

@commands.command()
async def show(self, ctx, short='open', start=0):
if not proceed_to_party():
return
"""Show a list of open polls or show a specific poll.
Parameters: "open" (default), "closed", "prepared" or <label>"""

Expand Down Expand Up @@ -419,6 +441,8 @@ def item_fct(i, item):

@commands.command()
async def draw(self, ctx, short=None, opt=None):
if not proceed_to_party():
return
server = await ask_for_server(self.bot, ctx.message, short)
if not server:
return
Expand Down Expand Up @@ -480,6 +504,8 @@ async def draw(self, ctx, short=None, opt=None):

@commands.command()
async def cmd(self, ctx, *, cmd=None):
if not proceed_to_party():
return
"""The old, command style way paired with the wizard."""
# await self.say_embed(ctx, say_text='This command is temporarily disabled.')

Expand Down Expand Up @@ -572,6 +598,8 @@ async def route(poll):

@commands.command()
async def quick(self, ctx, *, cmd=None):
if not proceed_to_party():
return
"""Create a quick poll with just a question and some options. Parameters: <Question> (optional)"""
server = await ask_for_server(self.bot, ctx.message)
if not server:
Expand All @@ -594,6 +622,8 @@ async def route(poll):

@commands.command()
async def prepare(self, ctx, *, cmd=None):
if not proceed_to_party():
return
"""Prepare a poll to use later. Parameters: <Question> (optional)"""
server = await ask_for_server(self.bot, ctx.message)
if not server:
Expand All @@ -618,6 +648,8 @@ async def route(poll):

@commands.command()
async def advanced(self, ctx, *, cmd=None):
if not proceed_to_party():
return
"""Poll with more options. Parameters: <Question> (optional)"""
server = await ask_for_server(self.bot, ctx.message)
if not server:
Expand All @@ -641,6 +673,8 @@ async def route(poll):

@commands.command()
async def new(self, ctx, *, cmd=None):
if not proceed_to_party():
return
"""Start the poll wizard to create a new poll step by step. Parameters: <Question> (optional)"""
server = await ask_for_server(self.bot, ctx.message)
if not server:
Expand Down Expand Up @@ -703,6 +737,8 @@ async def wizard(self, ctx, route, server):

@commands.Cog.listener()
async def on_raw_reaction_remove(self, data):
if not proceed_to_party():
return
# get emoji symbol
emoji = data.emoji
if not emoji:
Expand Down Expand Up @@ -768,7 +804,10 @@ async def on_raw_reaction_remove(self, data):

@commands.Cog.listener()
async def on_raw_reaction_add(self, data):
# dont look at bot's own reactions
if not proceed_to_party():
return

# don't look at bot's own reactions
user_id = data.user_id
if user_id == self.bot.user.id:
return
Expand Down Expand Up @@ -825,10 +864,11 @@ async def on_raw_reaction_add(self, data):
return

p = await Poll.load_from_db(self.bot, server.id, label)

if not isinstance(p, Poll):
return
# member = server.get_member(user_id)
user = member = data.member

# export
if emoji.name == '📎':
self.ignore_next_removed_reaction[str(message.id) + str(emoji)] = user_id
Expand Down Expand Up @@ -974,13 +1014,28 @@ async def on_raw_reaction_add(self, data):
return
else:
# Assume: User wants to vote with reaction
tri = await get_token_rule_info(user_id, data.guild_id)
print(f"Token rule info result", tri)
if "success" in tri:
print("Success")
print(f"Role(s) added", tri["success"]["added"])
print(f"Role(s) removed", tri["success"]["removed"])
elif "error" in tri:
await message.remove_reaction(emoji, data.member)
await data.member.send(tri["error"])
return

print(f"Original roles: {data.member.roles}")
# This refreshes the user/member with their roles that were updated after /get-token-rule-info call
user = member = await data.member.guild.fetch_member(user_id)
print(f"New roles: {member.roles}")

# no rights, terminate function
if not p.has_required_role(member):
await message.remove_reaction(emoji, user)
await member.send(f'You are not allowed to vote in this poll. Only users with '
f'at least one of these roles can vote:\n{", ".join(p.roles)}')
return

# check if we need to remove reactions (this will trigger on_reaction_remove)
if not isinstance(channel, discord.DMChannel) and (p.anonymous or p.hide_count):
# immediately remove reaction and to be safe, remove all reactions
Expand All @@ -1001,6 +1056,23 @@ async def on_raw_reaction_add(self, data):
await p.vote(member, emoji.name, message)


async def get_token_rule_info(user_id, guild_id):
try:
data = requests.post(os.environ.get('PM_STARRY_BACKEND') + "/token-rule-info",
data={'discordUserId': user_id, 'guildId': guild_id})
data.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("Other error", err)

content = data.json()
return content

def setup(bot):
global logger
logger = logging.getLogger('discord')
Expand Down
10 changes: 10 additions & 0 deletions essentials/secrets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import os

class Secrets:
def __init__(self):
self.dbl_token = '' # DBL token (only needed for public bot)
self.mongo_db = os.environ.get('PM_DB')
self.bot_token = os.environ.get('PM_BOT_TOKEN')
self.mode = 'development' # or production

SECRETS = Secrets()
15 changes: 15 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const express = require('express')
const app = express()
const port = 3000

app.get('/health-hack', (req, res) => {
res.sendStatus(200)
})

app.post('/health-hack', (req, res) => {
res.sendStatus(200)
})

app.listen(port, () => {
console.log(`Health hack listening on port ${port}`)
})
15 changes: 12 additions & 3 deletions launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from bot import ClusterBot
from essentials.multi_server import get_pre
from essentials.settings import SETTINGS
from utils.misc import proceed_to_party

TOKEN = SETTINGS.bot_token

Expand Down Expand Up @@ -45,6 +46,7 @@ def __init__(self, loop):
self.init = time.perf_counter()

def get_shard_count(self):
print(f"Settings.mode is {SETTINGS.mode}")
if SETTINGS.mode == "development":
return 1
data = requests.get('https://discordapp.com/api/v7/gateway/bot', headers={
Expand Down Expand Up @@ -81,8 +83,11 @@ def task_complete(self, task):

async def startup(self):
shards = list(range(self.get_shard_count()))
size = [shards[x:x + 4] for x in range(0, len(shards), 4)]
print(f"Shards: {shards}")
# size = [shards[x:x + 4] for x in range(0, len(shards), 4)]
size = [shards[x:x + 1] for x in range(0, len(shards), 1)]
log.info(f"Preparing {len(size)} clusters")
print(f"Preparing {len(size)} clusters")
for shard_ids in size:
self.cluster_queue.append(Cluster(self, next(NAMES), shard_ids, len(shards)))

Expand Down Expand Up @@ -126,7 +131,7 @@ async def start_cluster(self):
if self.cluster_queue:
cluster = self.cluster_queue.pop(0)
log.info(f"Starting Cluster#{cluster.name}")
await cluster.start()
await cluster.start(force=True)
log.info("Done!")
self.clusters.append(cluster)
await self.start_cluster()
Expand Down Expand Up @@ -193,6 +198,10 @@ def stop(self, sign=signal.SIGINT):
pass




if __name__ == "__main__":
print("in main")
loop = asyncio.get_event_loop()
Launcher(loop).start()
launcher = Launcher(loop)
launcher.start()
1 change: 0 additions & 1 deletion models/poll.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ def __init__(self, bot, ctx=None, server=None, channel=None, load=False):

self.bot = bot
self.cursor_pos = 0

self.vote_counts = {}
self.vote_counts_weighted = {}
self.full_votes = []
Expand Down
22 changes: 22 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "pollmaster-health-check",
"version": "1.0.0",
"description": "Just returns 200 for Render",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/starryzone/pollmaster.git"
},
"author": "Mike Purvis",
"license": "MIT",
"bugs": {
"url": "https://github.com/starryzone/pollmaster/issues"
},
"homepage": "https://github.com/starryzone/pollmaster#readme",
"dependencies": {
"express": "^4.17.3"
}
}
Loading