Skip to content

Commit 7edc4a1

Browse files
committed
feat: add MarkAsSolution view and integrate acceptance feature in post assist workflow
1 parent c1f2752 commit 7edc4a1

File tree

3 files changed

+70
-28
lines changed

3 files changed

+70
-28
lines changed

src/ui/views/forum_showcase.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,10 @@ async def channel_select(self, interaction: Interaction, selection: ChannelSelec
9999
self.forum_showcase.target_channel = self.selected_channel
100100
await interaction.response.defer()
101101

102+
102103
class ConfigureInterval(View):
103-
def __init__(self,
104+
def __init__(
105+
self,
104106
forum_showcase: ForumShowcase,
105107
forum_showcase_db: ForumShowcaseDB,
106108
logger: Logger,
@@ -116,7 +118,7 @@ async def cancel_button(self, interaction: Interaction, button: Button):
116118
await interaction.response.send_message("Skipped!", ephemeral=True)
117119
self.stop()
118120

119-
@button(label="Submit", style=ButtonStyle.green, custom_id="submit-interval-select") # type: ignore
121+
@button(label="Submit", style=ButtonStyle.green, custom_id="submit-interval-select") # type: ignore
120122
async def submit_button(self, interaction: Interaction, button: Button):
121123
if self.selected_interval is None:
122124
await interaction.response.send_message(
@@ -159,6 +161,7 @@ async def select_interval(self, interaction: Interaction, selection: Select):
159161
self.forum_showcase.interval = self.selected_interval
160162
await interaction.response.defer()
161163

164+
162165
class ConfigureWeekday(View):
163166
def __init__(
164167
self,
@@ -304,6 +307,8 @@ def parse_schedule(schedule: str) -> datetime:
304307
second=0,
305308
microsecond=0,
306309
)
307-
parsed_schedule = (parsed_schedule - timedelta(hours=8)).replace(tzinfo=timezone.utc)
310+
parsed_schedule = (parsed_schedule - timedelta(hours=8)).replace(
311+
tzinfo=timezone.utc
312+
)
308313

309314
return parsed_schedule

src/ui/views/mark_as_solution.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from discord.ui import View, button
2+
from discord import Message, Thread, ButtonStyle, Interaction, Button
3+
4+
5+
class MarkAsSolution(View):
6+
def __init__(self, thread: Thread, message: Message):
7+
super().__init__(timeout=None)
8+
self.thread = thread
9+
self.message = message
10+
self.confirmed = False
11+
12+
@button(label="Yes", style=ButtonStyle.green) # type: ignore
13+
async def accept(self, interaction: Interaction, button: Button):
14+
self.confirmed = True
15+
self.stop()
16+
17+
@button(label="No", style=ButtonStyle.red) # type: ignore
18+
async def decline(self, interaction: Interaction, button: Button):
19+
self.confirmed = False
20+
await interaction.response.send_message("Cancelled.", ephemeral=True)
21+
self.stop()

src/ui/views/post_assist.py

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,48 +14,44 @@
1414
)
1515

1616

17-
class PostAssistState():
17+
class PostAssistState:
1818
def __init__(
1919
self,
2020
forum: int = None,
2121
tag_message: str = None,
2222
custom_msg: str = None,
2323
existing_tags: list[Role] | list[Member] = [],
24+
enable_accept_solutions: bool = False,
2425
finished: bool = False,
2526
):
2627
self.forum: int = forum
2728
self.tag_list: list[tuple[int, str]] = []
2829
self.existing_tags: list[Role] | list[Member] = existing_tags or []
2930
self.tag_message: str = tag_message
3031
self.custom_msg: str = custom_msg
32+
self.enable_accept_solutions: bool = enable_accept_solutions
3133
self.finished = finished
3234

3335

3436
class ConfigurePostAssist(View):
3537
def __init__(
36-
self,
37-
forum: int = None,
38-
tag_message: str = None,
39-
custom_msg: str = None
38+
self, forum: int = None, tag_message: str = None, custom_msg: str = None
4039
):
4140
super().__init__(timeout=480)
4241
self.state = PostAssistState(
4342
forum=forum,
4443
tag_message=tag_message,
4544
custom_msg=custom_msg,
4645
existing_tags=[],
46+
enable_accept_solutions=False,
4747
)
4848

4949
@select(
5050
cls=ChannelSelect,
5151
placeholder="Select forum...",
5252
channel_types=[ChannelType.forum],
5353
)
54-
async def select_forum(
55-
self,
56-
interaction: Interaction,
57-
selection: ChannelSelect
58-
):
54+
async def select_forum(self, interaction: Interaction, selection: ChannelSelect):
5955
if self.state.forum and self.state.forum != selection.values[0].id:
6056
return await interaction.response.send_message(
6157
f"Please select this forum -> {interaction.guild.get_channel(self.state.forum).mention}.",
@@ -100,13 +96,12 @@ def __init__(self, options: PostAssistState):
10096
self.state = options
10197
self.selection = [tag for tag in self.state.existing_tags]
10298

103-
select_menu = [item for item in
104-
self.children if isinstance(item, MentionableSelect)][0]
99+
select_menu = [
100+
item for item in self.children if isinstance(item, MentionableSelect)
101+
][0]
105102
select_menu.default_values = self.state.existing_tags
106103

107-
@select(cls=MentionableSelect,
108-
placeholder="Select member/roles...",
109-
max_values=25)
104+
@select(cls=MentionableSelect, placeholder="Select member/roles...", max_values=25)
110105
async def select_entities(
111106
self, interaction: Interaction, selection: MentionableSelect
112107
):
@@ -123,9 +118,7 @@ async def submit(self, interaction: Interaction, button: Button):
123118
for entity in self.selection
124119
]
125120

126-
modal = PostAssistTagMessage(
127-
self.state, required=bool(self.state.tag_list)
128-
)
121+
modal = PostAssistTagMessage(self.state, required=bool(self.state.tag_list))
129122
await interaction.response.send_modal(modal)
130123
await modal.wait()
131124
self.stop()
@@ -150,7 +143,34 @@ def __init__(self, options: PostAssistState, required: bool):
150143

151144
async def on_submit(self, interaction: Interaction) -> None:
152145
self.state.tag_message = self.message.value
153-
await interaction.response.send_message("Success...", ephemeral=True)
146+
147+
view = PostAssistMarkAsSolution(self.state)
148+
await interaction.response.send_message(
149+
"Enable Accept Solution feature?", view=view, ephemeral=True
150+
)
151+
await view.wait()
152+
self.stop()
153+
154+
155+
class PostAssistMarkAsSolution(View):
156+
def __init__(self, options: PostAssistState):
157+
super().__init__(timeout=480)
158+
self.state = options
159+
160+
@button(label="Yes")
161+
async def enable(self, interaction: Interaction, button: Button):
162+
self.state.enable_accept_solutions = True
163+
164+
await interaction.response.send_message(
165+
"Mark as solution will be enabled.", ephemeral=True
166+
)
167+
await interaction.followup.send("Success...", ephemeral=True)
168+
self.state.finished = True
169+
self.stop()
170+
171+
@button(label="No")
172+
async def disable(self, interaction: Interaction, button: Button):
173+
self.state.enable_accept_solutions = False
154174
self.state.finished = True
155175
self.stop()
156176

@@ -172,9 +192,7 @@ async def previous(self, interaction: Interaction, button: Button):
172192
button.disabled = True
173193

174194
await interaction.response.edit_message(
175-
content=format_data(self.data[self.page],
176-
interaction.guild,
177-
self.getter),
195+
content=format_data(self.data[self.page], interaction.guild, self.getter),
178196
view=self,
179197
)
180198

@@ -188,9 +206,7 @@ async def next(self, interaction: Interaction, button: Button):
188206
button.disabled = True
189207

190208
await interaction.response.edit_message(
191-
content=format_data(self.data[self.page],
192-
interaction.guild,
193-
self.getter),
209+
content=format_data(self.data[self.page], interaction.guild, self.getter),
194210
view=self,
195211
)
196212

0 commit comments

Comments
 (0)