generated from HoloTech/holotech-plugin-template
Compare commits
2 Commits
0923f32a82
...
d8817d4473
| Author | SHA1 | Date | |
|---|---|---|---|
| d8817d4473 | |||
| a18885511a |
@@ -2,8 +2,10 @@ BEGIN;
|
|||||||
|
|
||||||
-- Version dependency checks
|
-- Version dependency checks
|
||||||
DO $$
|
DO $$
|
||||||
|
BEGIN
|
||||||
ASSERT current_module_version('PROFILES') = 1, 'Dependency version mismatch: PROFILES';
|
ASSERT current_module_version('PROFILES') = 1, 'Dependency version mismatch: PROFILES';
|
||||||
ASSERT current_module_version('EVENT_TRACKER') = 2, 'Dependency version mismatch: EVENT_TRACKER';
|
ASSERT current_module_version('EVENT_TRACKER') = 2, 'Dependency version mismatch: EVENT_TRACKER';
|
||||||
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
-- Plugin version history
|
-- Plugin version history
|
||||||
|
|||||||
+15
-10
@@ -2,6 +2,8 @@ from typing import Any, Optional
|
|||||||
import datetime as dt
|
import datetime as dt
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
|
||||||
from data import ORDER, Condition
|
from data import ORDER, Condition
|
||||||
from data.conditions import NULL, condition
|
from data.conditions import NULL, condition
|
||||||
from utils.lib import utc_now
|
from utils.lib import utc_now
|
||||||
@@ -16,8 +18,9 @@ from . import logger
|
|||||||
|
|
||||||
|
|
||||||
class RewardCampaign:
|
class RewardCampaign:
|
||||||
def __init__(self, row: Campaign):
|
def __init__(self, row: Campaign, session: aiohttp.ClientSession | None = None):
|
||||||
self.row = row
|
self.row = row
|
||||||
|
self._session = session
|
||||||
|
|
||||||
self._webhook: ThreadedWebhook | None = None
|
self._webhook: ThreadedWebhook | None = None
|
||||||
self._cached_webhookurl: str | None = None
|
self._cached_webhookurl: str | None = None
|
||||||
@@ -33,7 +36,7 @@ class RewardCampaign:
|
|||||||
if url is not None:
|
if url is not None:
|
||||||
# TODO: I don't know if these needs a client
|
# TODO: I don't know if these needs a client
|
||||||
# Might be hard if so given we need to run this from Twitch client as well
|
# Might be hard if so given we need to run this from Twitch client as well
|
||||||
self._webhook = ThreadedWebhook.from_url(url)
|
self._webhook = ThreadedWebhook.from_url(url, session=self._session)
|
||||||
else:
|
else:
|
||||||
self._webhook = None
|
self._webhook = None
|
||||||
return self._webhook
|
return self._webhook
|
||||||
@@ -170,8 +173,10 @@ class RewardCampaign:
|
|||||||
class CampaignRegistry:
|
class CampaignRegistry:
|
||||||
VERSION = CampaignData.VERSION
|
VERSION = CampaignData.VERSION
|
||||||
|
|
||||||
def __init__(self, data: CampaignData):
|
def __init__(self, data: CampaignData, session: aiohttp.ClientSession | None = None):
|
||||||
self.data = data
|
self.data = data
|
||||||
|
# TODO: Actually pass in a session
|
||||||
|
self._session = aiohttp.ClientSession()
|
||||||
|
|
||||||
async def init(self):
|
async def init(self):
|
||||||
await self.data.init()
|
await self.data.init()
|
||||||
@@ -183,7 +188,7 @@ class CampaignRegistry:
|
|||||||
row = await Campaign.fetch(campaign_id)
|
row = await Campaign.fetch(campaign_id)
|
||||||
if row is None:
|
if row is None:
|
||||||
raise ValueError("Campign %s doesn't exist." % campaign_id)
|
raise ValueError("Campign %s doesn't exist." % campaign_id)
|
||||||
camp = RewardCampaign(row)
|
camp = RewardCampaign(row, session=self._session)
|
||||||
return camp
|
return camp
|
||||||
|
|
||||||
async def fetch_campaigns(
|
async def fetch_campaigns(
|
||||||
@@ -207,7 +212,7 @@ class CampaignRegistry:
|
|||||||
condition = condition and ~active_condition
|
condition = condition and ~active_condition
|
||||||
|
|
||||||
rows = await Campaign.fetch_where(condition)
|
rows = await Campaign.fetch_where(condition)
|
||||||
campaigns = [RewardCampaign(row) for row in rows]
|
campaigns = [RewardCampaign(row, session=self._session) for row in rows]
|
||||||
|
|
||||||
return campaigns
|
return campaigns
|
||||||
|
|
||||||
@@ -221,13 +226,13 @@ class CampaignRegistry:
|
|||||||
"""
|
"""
|
||||||
results = await Campaign.fetch_where(
|
results = await Campaign.fetch_where(
|
||||||
Condition._expression_equality(
|
Condition._expression_equality(
|
||||||
LOWER(Campaign.campaign_name.expr), LOWER(asexpr(name))
|
LOWER(Campaign.campaign_name), LOWER(asexpr(name))
|
||||||
),
|
),
|
||||||
campaignid=cid,
|
communityid=cid,
|
||||||
)
|
)
|
||||||
if results:
|
if results:
|
||||||
row = results[0]
|
row = results[0]
|
||||||
camp = RewardCampaign(row)
|
camp = RewardCampaign(row, session=self._session)
|
||||||
else:
|
else:
|
||||||
camp = None
|
camp = None
|
||||||
return camp
|
return camp
|
||||||
@@ -247,7 +252,7 @@ class CampaignRegistry:
|
|||||||
campaign_name=campaign_name,
|
campaign_name=campaign_name,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
return RewardCampaign(row)
|
return RewardCampaign(row, session=self._session)
|
||||||
|
|
||||||
async def update_campaign(
|
async def update_campaign(
|
||||||
self,
|
self,
|
||||||
@@ -261,4 +266,4 @@ class CampaignRegistry:
|
|||||||
"""
|
"""
|
||||||
campaign = await Campaign.fetch(campaign_id)
|
campaign = await Campaign.fetch(campaign_id)
|
||||||
await campaign.update(**kwargs)
|
await campaign.update(**kwargs)
|
||||||
return RewardCampaign(campaign)
|
return RewardCampaign(campaign, session=self._session)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
from aiohttp import client
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands as cmds
|
from discord.ext import commands as cmds
|
||||||
from discord import Forbidden, User, app_commands as appcmds
|
from discord import Forbidden, User, app_commands as appcmds
|
||||||
@@ -193,6 +194,7 @@ class CampaignCog(LionCog):
|
|||||||
moderator_role_id=moderator_role.id if moderator_role else None,
|
moderator_role_id=moderator_role.id if moderator_role else None,
|
||||||
logging_webhook_url=logging_webhook,
|
logging_webhook_url=logging_webhook,
|
||||||
)
|
)
|
||||||
|
await campaign.start()
|
||||||
|
|
||||||
# Ack creation
|
# Ack creation
|
||||||
# TODO: Can also show dashboard
|
# TODO: Can also show dashboard
|
||||||
@@ -256,7 +258,7 @@ class CampaignCog(LionCog):
|
|||||||
|
|
||||||
# If logging webhook is given, check that it works
|
# If logging webhook is given, check that it works
|
||||||
if logging_webhook is not None:
|
if logging_webhook is not None:
|
||||||
webhook = ThreadedWebhook.from_url(logging_webhook)
|
webhook = ThreadedWebhook.from_url(logging_webhook, client=self.bot)
|
||||||
try:
|
try:
|
||||||
await webhook.test_webhook()
|
await webhook.test_webhook()
|
||||||
except (discord.HTTPException, discord.Forbidden):
|
except (discord.HTTPException, discord.Forbidden):
|
||||||
@@ -276,9 +278,9 @@ class CampaignCog(LionCog):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Ack creation
|
# Ack creation
|
||||||
# TODO: Can also show dashboard
|
|
||||||
await ctx.reply(
|
await ctx.reply(
|
||||||
f"Setup and started your reward campaign {campaign.row.campaign_name}! Good luck"
|
"Updated your campaign, good luck!",
|
||||||
|
ephemeral=True
|
||||||
)
|
)
|
||||||
|
|
||||||
campaign_configure_cmd.autocomplete("campaign_name")(_campaign_acmpl)
|
campaign_configure_cmd.autocomplete("campaign_name")(_campaign_acmpl)
|
||||||
|
|||||||
@@ -16,9 +16,8 @@ from meta import LionBot
|
|||||||
from meta.errors import UserInputError
|
from meta.errors import UserInputError
|
||||||
from meta.config import conf
|
from meta.config import conf
|
||||||
from utils.lib import tabulate, utc_now, MessageArgs, parse_duration
|
from utils.lib import tabulate, utc_now, MessageArgs, parse_duration
|
||||||
from utils.ui import MessageUI, AButton, AsComponents, ConfigEditor
|
from utils.ui import MessageUI
|
||||||
from utils.ui.micros import FastModal
|
from utils.ui.micros import FastModal
|
||||||
from utils.ui.pagers import BasePager, Pager
|
|
||||||
|
|
||||||
from ...campaign import RewardCampaign
|
from ...campaign import RewardCampaign
|
||||||
from ...data import EarnedReward
|
from ...data import EarnedReward
|
||||||
@@ -54,7 +53,7 @@ class CampaignDashboard(MessageUI):
|
|||||||
await widget.wait()
|
await widget.wait()
|
||||||
self._slaves.remove(widget)
|
self._slaves.remove(widget)
|
||||||
|
|
||||||
@button(emoji=conf.emojis.cancel, style=ButtonStyle.red)
|
@button(emoji=conf.emojis.cancel)
|
||||||
async def quit_button(self, press: discord.Interaction, pressed: Button):
|
async def quit_button(self, press: discord.Interaction, pressed: Button):
|
||||||
"""Close the UI and all children."""
|
"""Close the UI and all children."""
|
||||||
await press.response.defer(thinking=False)
|
await press.response.defer(thinking=False)
|
||||||
@@ -124,7 +123,7 @@ class CampaignDashboard(MessageUI):
|
|||||||
|
|
||||||
embed.add_field(
|
embed.add_field(
|
||||||
name="Rewards Summary",
|
name="Rewards Summary",
|
||||||
value=blocks[0] or 'No Rewards Earned',
|
value=blocks[0] if blocks else 'No Rewards Earned',
|
||||||
inline=True
|
inline=True
|
||||||
)
|
)
|
||||||
for block in blocks[1:]:
|
for block in blocks[1:]:
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ class RewardList(MessageUI):
|
|||||||
self.pagen -= 1
|
self.pagen -= 1
|
||||||
await self.refresh()
|
await self.refresh()
|
||||||
|
|
||||||
@button(emoji=conf.emojis.cancel, style=ButtonStyle.red)
|
@button(emoji=conf.emojis.cancel)
|
||||||
async def quit_button(self, press: discord.Interaction, pressed: Button):
|
async def quit_button(self, press: discord.Interaction, pressed: Button):
|
||||||
"""Close the UI and all children."""
|
"""Close the UI and all children."""
|
||||||
await press.response.defer(thinking=False)
|
await press.response.defer(thinking=False)
|
||||||
@@ -247,7 +247,7 @@ class RewardList(MessageUI):
|
|||||||
value = reward.earned_id
|
value = reward.earned_id
|
||||||
|
|
||||||
return SelectOption(
|
return SelectOption(
|
||||||
label=name, value=value
|
label=name, value=str(value)
|
||||||
)
|
)
|
||||||
|
|
||||||
async def refresh_layout(self):
|
async def refresh_layout(self):
|
||||||
@@ -256,7 +256,7 @@ class RewardList(MessageUI):
|
|||||||
)
|
)
|
||||||
await asyncio.gather(*to_refresh)
|
await asyncio.gather(*to_refresh)
|
||||||
|
|
||||||
if self.page_count > 1:
|
if self.page_count <= 1:
|
||||||
self.prev_page_button.disabled = True
|
self.prev_page_button.disabled = True
|
||||||
self.next_page_button.disabled = True
|
self.next_page_button.disabled = True
|
||||||
else:
|
else:
|
||||||
@@ -270,7 +270,24 @@ class RewardList(MessageUI):
|
|||||||
|
|
||||||
async def make_message(self) -> MessageArgs:
|
async def make_message(self) -> MessageArgs:
|
||||||
embed = discord.Embed(title=f"{self.campaign.row.campaign_name} Reward List")
|
embed = discord.Embed(title=f"{self.campaign.row.campaign_name} Reward List")
|
||||||
# embed.set_footer with last update
|
embed.set_footer(text='Last Update')
|
||||||
|
embed.timestamp = utc_now()
|
||||||
|
|
||||||
|
campaign = self.campaign
|
||||||
|
all_rewards = await campaign.get_rewards()
|
||||||
|
rewards_earned = len(all_rewards)
|
||||||
|
reward_cap = campaign.row.target_rewards
|
||||||
|
if reward_cap is not None:
|
||||||
|
description = f"{rewards_earned} earned out of {reward_cap} available"
|
||||||
|
else:
|
||||||
|
description = f"{rewards_earned} earned so far"
|
||||||
|
|
||||||
|
embed.description = description
|
||||||
|
|
||||||
|
|
||||||
|
for reward in self.page:
|
||||||
|
name, value = self._format_reward_section(reward)
|
||||||
|
embed.add_field(name=name, value=value, inline=False)
|
||||||
|
|
||||||
return MessageArgs(embed=embed)
|
return MessageArgs(embed=embed)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -62,4 +62,4 @@ class ThreadedWebhook(discord.Webhook):
|
|||||||
)
|
)
|
||||||
result = await self.send(embed=embed, wait=True, silent=True)
|
result = await self.send(embed=embed, wait=True, silent=True)
|
||||||
asyncio.create_task(fire_and_forget(result.delete()))
|
asyncio.create_task(fire_and_forget(result.delete()))
|
||||||
await result
|
return result
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from twitchio.ext import commands as cmds
|
|||||||
|
|
||||||
from meta import Bot
|
from meta import Bot
|
||||||
from meta.logger import log_wrap
|
from meta.logger import log_wrap
|
||||||
|
from meta.sockets import Channel, register_channel
|
||||||
from utils.lib import utc_now
|
from utils.lib import utc_now
|
||||||
|
|
||||||
from . import logger
|
from . import logger
|
||||||
@@ -136,9 +137,11 @@ class CampaignComponent(cmds.Component):
|
|||||||
reward_cap = campaign.row.target_rewards
|
reward_cap = campaign.row.target_rewards
|
||||||
|
|
||||||
if reward_cap is not None:
|
if reward_cap is not None:
|
||||||
response = f"{name}: {given} rewards earned out of {cap}!"
|
response = (
|
||||||
|
f"{name}: {rewards_earned} rewards earned out of {reward_cap}!"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
response = f"{name}: {given} rewards earned so far!"
|
response = f"{name}: {rewards_earned} rewards earned so far!"
|
||||||
formatted = response.format(
|
formatted = response.format(
|
||||||
name=campaign.row.campaign_name,
|
name=campaign.row.campaign_name,
|
||||||
given=rewards_earned,
|
given=rewards_earned,
|
||||||
@@ -180,7 +183,9 @@ class CampaignComponent(cmds.Component):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Now can create
|
# Now can create
|
||||||
campaign = await self.campaigns.create_campaign(cid, name, rewards)
|
campaign = await self.campaigns.create_campaign(
|
||||||
|
cid, name, target_rewards=rewards
|
||||||
|
)
|
||||||
|
|
||||||
# Also start the campaign
|
# Also start the campaign
|
||||||
await campaign.start()
|
await campaign.start()
|
||||||
@@ -230,9 +235,9 @@ class CampaignComponent(cmds.Component):
|
|||||||
reward_cap = campaign.row.target_rewards
|
reward_cap = campaign.row.target_rewards
|
||||||
|
|
||||||
if reward_cap is not None:
|
if reward_cap is not None:
|
||||||
response = f"Completed {name}: {given} rewards earned out of {cap}!"
|
response = f"Completed {name}: {rewards_earned} rewards earned out of {reward_cap}!"
|
||||||
else:
|
else:
|
||||||
response = f"Completed {name}: {given} rewards earned so far!"
|
response = f"Completed {name}: {rewards_earned} rewards earned so far!"
|
||||||
formatted = response.format(
|
formatted = response.format(
|
||||||
name=campaign.row.campaign_name,
|
name=campaign.row.campaign_name,
|
||||||
given=rewards_earned,
|
given=rewards_earned,
|
||||||
|
|||||||
Reference in New Issue
Block a user