Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
F
fernuni-bot
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
dnns01
fernuni-bot
Commits
538561bf
Unverified
Commit
538561bf
authored
3 years ago
by
dnns01
Committed by
GitHub
3 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Release Advent Calendar (#134)
* Advent calendar (#131) * Advent calendar (#132) * Advent calendar (#133)
parent
84c82fce
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
.env.template
+4
-0
4 additions, 0 deletions
.env.template
cogs/christmas.py
+159
-34
159 additions, 34 deletions
cogs/christmas.py
utils.py
+22
-2
22 additions, 2 deletions
utils.py
with
185 additions
and
36 deletions
.env.template
+
4
−
0
View file @
538561bf
...
...
@@ -38,6 +38,8 @@ DISCORD_CALMDOWN_ROLE=<ID of "Calmdown" role>
DISCORD_BOTUEBUNGSPLATZ_CHANNEL=<ID of 'bot-übungsplatz' channel>
DISCORD_ELM_STREET_CHANNEL=<ID of elm street channel>
DISCORD_HALLOWEEN_CATEGORY=<ID of Halloween category>
DISCORD_SEASONAL_EVENTS_CATEGORY=<ID of Seasonal Events Category>
DISCORD_ADVENT_CALENDAR_CHANNEL_2021=<ID of advent calendar chanel for 2021>
# JSON Files
DISCORD_ROLES_FILE=<File name for roles JSON file>
...
...
@@ -51,7 +53,9 @@ DISCORD_CALMDOWN_FILE=<File name for calmdowns JSON file>
DISCORD_MODULE_COURSE_FILE=<File name for module course JSON file>
DISCORD_MODULE_DATA_FILE=<File name for module data JSON file>
DISCORD_TIMER_FILE=<File name for running timers JSON file>
DISCORD_ADVENT_CALENDAR_FILE=<File name for advent calendar JSON file>
# Misc
DISCORD_DATE_TIME_FORMAT=<Date and time format used for commands like %d.%m.%Y %H:%M>
DISCORD_IDEE_REACT_QTY=<Amount of reactions to a submitted idea, neccessary to create a github issue (amount is including botys own reaction)>
DISCORD_ADVENT_CALENDAR_START=<Start date and time for advent calendar. Something like "01.12.2021 00:00">
This diff is collapsed.
Click to expand it.
cogs/christmas.py
+
159
−
34
View file @
538561bf
import
asyncio
import
json
import
os
from
datetime
import
datetime
from
datetime
import
datetime
,
timedelta
from
disnake.ext
import
commands
from
disnake
import
ApplicationCommandInteraction
,
Member
from
disnake.ext
import
commands
,
tasks
from
dotenv
import
load_dotenv
import
utils
load_dotenv
()
def
create_advent_calendar
():
advent_calendar
=
[]
startdate
=
utils
.
date_from_string
(
os
.
getenv
(
"
DISCORD_ADVENT_CALENDAR_START
"
)).
astimezone
()
for
i
in
range
(
0
,
24
):
advent_calendar
.
append
({
"
number
"
:
i
+
1
,
"
date
"
:
utils
.
date_to_string
(
startdate
+
timedelta
(
days
=
i
)),
"
assigned
"
:
False
,
"
opened
"
:
False
})
return
advent_calendar
class
Christmas
(
commands
.
Cog
):
def
__init__
(
self
,
bot
):
self
.
bot
=
bot
self
.
channel_id
=
int
(
os
.
getenv
(
"
DISCORD_ADVENT_CALENDAR_CHANNEL
"
,
"
0
"
))
self
.
advent_calendar
=
[]
self
.
load_advent_calendar
()
def
load_advent_calendar
(
self
):
advent_calendar_file
=
open
(
"
data/advent_calendar.json
"
,
mode
=
'
r
'
)
self
.
advent_calendar
=
json
.
load
(
advent_calendar_file
)
@commands.Cog.listener
()
async
def
on_raw_reaction_add
(
self
,
payload
):
if
payload
.
message_id
==
int
(
os
.
getenv
(
"
DISCORD_ADVENT_CALENDAR_MESSAGE
"
)):
roles
=
{}
guild
=
await
self
.
bot
.
fetch_guild
(
payload
.
guild_id
)
member
=
await
guild
.
fetch_member
(
payload
.
user_id
)
channel
=
await
self
.
bot
.
fetch_channel
(
payload
.
channel_id
)
message
=
await
channel
.
fetch_message
(
payload
.
message_id
)
await
message
.
clear_reactions
()
for
role
in
guild
.
roles
:
roles
[
str
(
role
.
id
)]
=
role
today
=
datetime
.
now
()
day
=
today
.
day
if
today
.
day
<=
24
else
24
if
today
<
datetime
(
year
=
2020
,
month
=
12
,
day
=
1
):
return
for
i
in
range
(
0
,
day
):
door
=
self
.
advent_calendar
[
i
]
if
payload
.
emoji
.
name
==
door
[
"
emote
"
]:
await
member
.
add_roles
(
roles
[
door
[
"
role
"
]])
await
utils
.
send_dm
(
member
,
f
"
Glückwunsch, du hast gerade
{
door
[
'
name
'
]
}
geöffnet
"
)
self
.
seasonal_events_category
=
int
(
os
.
getenv
(
"
DISCORD_SEASONAL_EVENTS_CATEGORY
"
))
self
.
advent_calendar_channel
=
int
(
os
.
getenv
(
"
DISCORD_ADVENT_CALENDAR_CHANNEL_2021
"
))
self
.
file_name
=
os
.
getenv
(
"
DISCORD_ADVENT_CALENDAR_FILE
"
)
self
.
advent_calendar
=
self
.
load
()
self
.
advent_calendar_loop
.
start
()
def
load
(
self
):
with
open
(
self
.
file_name
,
mode
=
'
r
'
)
as
f
:
advent_calendar
=
json
.
load
(
f
)
if
len
(
advent_calendar
)
==
0
:
advent_calendar
=
create_advent_calendar
()
return
advent_calendar
def
save
(
self
):
with
open
(
self
.
file_name
,
mode
=
'
w
'
)
as
f
:
json
.
dump
(
self
.
advent_calendar
,
f
)
@commands.slash_command
(
name
=
"
advent
"
,
guild_ids
=
[
int
(
os
.
getenv
(
'
DISCORD_GUILD
'
))])
async
def
cmd_advent
(
self
,
interaction
:
ApplicationCommandInteraction
):
pass
@cmd_advent.sub_command
(
name
=
"
list
"
,
description
=
"
Erhalte die Liste aller Türchen mit Zuordnung und Thema
"
)
@commands.check
(
utils
.
is_mod
)
async
def
cmd_advent_list
(
self
,
interaction
:
ApplicationCommandInteraction
):
message
=
f
"
__**Adventskalender 2021**__
\n\n
"
for
day
in
self
.
advent_calendar
:
message
+=
f
"
{
day
[
'
number
'
]
}
.
"
if
day
[
"
assigned
"
]:
message
+=
f
"
<@!
{
day
[
'
assignee
'
]
}
>:
\"
{
day
[
'
name
'
]
}
\"
"
else
:
message
+=
f
"
noch nicht zugewiesen
"
message
+=
"
\n
"
await
interaction
.
response
.
send_message
(
message
,
ephemeral
=
True
)
@cmd_advent.sub_command
(
name
=
"
assign
"
,
description
=
"
Einer Person ein Türchen zuweisen
"
,
guild_ids
=
[
int
(
os
.
getenv
(
'
DISCORD_GUILD
'
))])
@commands.check
(
utils
.
is_mod
)
async
def
cmd_advent_assign
(
self
,
interaction
:
ApplicationCommandInteraction
,
day
:
int
,
member
:
Member
,
name
:
str
):
if
self
.
advent_calendar
[
day
-
1
][
"
assigned
"
]:
await
interaction
.
response
.
send_message
(
"
Das gewählte Türchen ist bereits vergeben.
\n
"
"
Wenn du das Türchen an jemand anderen vergeben möchtest, oder das
"
"
Thema ändern möchtest, verwende `/advent reassign`.
"
,
ephemeral
=
True
)
else
:
await
interaction
.
response
.
defer
(
ephemeral
=
True
)
await
self
.
assign_day
(
day
,
member
,
name
)
await
interaction
.
edit_original_message
(
content
=
"
Das gewählte Türchen wurde vergeben.
"
)
@cmd_advent.sub_command
(
name
=
"
reassign
"
,
description
=
"
Ein Türchen neu zuweisen
"
,
guild_ids
=
[
int
(
os
.
getenv
(
'
DISCORD_GUILD
'
))])
@commands.check
(
utils
.
is_mod
)
async
def
cmd_advent_reassign
(
self
,
interaction
:
ApplicationCommandInteraction
,
day
:
int
,
member
:
Member
,
name
:
str
):
if
not
self
.
advent_calendar
[
day
-
1
][
"
assigned
"
]:
await
interaction
.
response
.
send_message
(
"
Das gewählte Türchen ist noch nicht vergeben.
\n
"
"
Bitte verwende `/advent assign` um das Türchen an
"
"
jemanden zu vergeben.
"
,
ephemeral
=
True
)
else
:
await
interaction
.
response
.
defer
(
ephemeral
=
True
)
channel
=
await
self
.
bot
.
fetch_channel
(
self
.
advent_calendar
[
day
-
1
][
"
channel
"
])
old_member
=
await
self
.
bot
.
fetch_user
(
self
.
advent_calendar
[
day
-
1
][
"
assignee
"
])
await
channel
.
set_permissions
(
old_member
,
overwrite
=
None
)
await
self
.
assign_day
(
day
,
member
,
name
)
await
interaction
.
edit_original_message
(
content
=
"
Das gewählte Türchen wurde neu vergeben.
"
)
@cmd_advent.sub_command
(
name
=
"
remaining
"
,
description
=
"
Noch nicht zugewiesene Türchen ausgeben lassen.
"
,
guild_ids
=
[
int
(
os
.
getenv
(
'
DISCORD_GUILD
'
))])
@commands.check
(
utils
.
is_mod
)
async
def
cmd_advent_remaining
(
self
,
interaction
:
ApplicationCommandInteraction
):
message
=
f
"
Noch verfügbare Türchen:
"
for
day
in
self
.
advent_calendar
:
if
not
day
[
"
assigned
"
]:
message
+=
f
"
{
day
[
'
number
'
]
}
,
"
await
interaction
.
response
.
send_message
(
message
[:
-
2
],
ephemeral
=
True
)
async
def
assign_day
(
self
,
day
:
int
,
member
:
Member
,
name
:
str
):
category
=
await
self
.
bot
.
fetch_channel
(
self
.
seasonal_events_category
)
channel
=
await
category
.
create_text_channel
(
f
"
{
day
}
-
{
name
}
"
)
await
channel
.
set_permissions
(
member
.
roles
[
0
],
view_channel
=
False
)
await
channel
.
set_permissions
(
member
,
view_channel
=
True
)
await
channel
.
send
(
f
"
Vielen Dank
{
member
.
mention
}
, dass du für das
{
day
}
. Türchen etwas zum Thema
{
name
}
"
f
"
vorbereiten möchtest. Dieser Channel ist für dich gedacht. Du kannst hier deinen Beitrag
"
f
"
vorbereiten.
\n\n
"
f
"
Am
{
day
}
.12.2021 um 00:00 werden alle Nachrichten von dir, die in diesem Channel bis
"
f
"
dahin geschrieben wurden, in einen eigenen Thread für diesen Tag übernommen.
\n\n
"
f
"
Beachte bitte, dass Sticker nicht verwendet werden können. Das gleiche gilt für Emojis,
"
f
"
die nicht von diesem Server sind.
\n\n
"
f
"
Das Mod-Team wünscht dir viel Spaß bei der Vorbereitung.
"
)
self
.
advent_calendar
[
day
-
1
][
"
channel
"
]
=
channel
.
id
self
.
advent_calendar
[
day
-
1
][
"
assigned
"
]
=
True
self
.
advent_calendar
[
day
-
1
][
"
assignee
"
]
=
member
.
id
self
.
advent_calendar
[
day
-
1
][
"
name
"
]
=
name
self
.
save
()
async
def
open
(
self
,
day
):
source_channel
=
await
self
.
bot
.
fetch_channel
(
day
[
"
channel
"
])
assignee
=
await
self
.
bot
.
fetch_user
(
day
[
"
assignee
"
])
target_channel
=
await
self
.
bot
.
fetch_channel
(
self
.
advent_calendar_channel
)
thread_name
=
f
"
{
day
[
'
number
'
]
}
.
{
day
[
'
name
'
]
}
"
message
=
await
target_channel
.
send
(
f
"
{
day
[
'
number
'
]
}
.
\"
{
day
[
'
name
'
]
}
\"
, ein Beitrag von
{
assignee
.
mention
}
:
"
)
thread
=
await
message
.
create_thread
(
name
=
thread_name
,
auto_archive_duration
=
1440
)
day
[
"
thread
"
]
=
thread
.
id
day
[
"
opened
"
]
=
True
async
for
msg
in
source_channel
.
history
(
limit
=
None
,
oldest_first
=
True
):
if
msg
.
author
==
assignee
:
if
len
(
msg
.
stickers
)
>
0
:
continue
files
=
await
utils
.
files_from_attachments
(
msg
.
attachments
)
await
thread
.
send
(
content
=
msg
.
content
,
embeds
=
msg
.
embeds
,
files
=
files
)
await
thread
.
send
(
"
--------------------------
\n
Beginn der Diskussion
\n
--------------------------
"
)
self
.
save
()
@tasks.loop
(
seconds
=
10
)
async
def
advent_calendar_loop
(
self
):
now
=
datetime
.
now
()
for
day
in
self
.
advent_calendar
:
if
not
day
[
"
opened
"
]:
due_date
=
utils
.
date_from_string
(
day
[
"
date
"
])
if
due_date
<=
now
:
await
self
.
open
(
day
)
else
:
return
@advent_calendar_loop.before_loop
async
def
before_advent_calendar_loop
(
self
):
await
asyncio
.
sleep
(
10
-
datetime
.
now
().
second
%
10
)
This diff is collapsed.
Click to expand it.
utils.py
+
22
−
2
View file @
538561bf
import
os
import
disnake
import
re
from
datetime
import
datetime
import
disnake
from
disnake
import
ButtonStyle
from
dotenv
import
load_dotenv
from
views.dialog_view
import
DialogView
load_dotenv
()
DATE_TIME_FMT
=
os
.
getenv
(
"
DISCORD_DATE_TIME_FORMAT
"
)
async
def
send_dm
(
user
,
message
,
embed
=
None
):
"""
Send DM to a user/member
"""
...
...
@@ -55,3 +59,19 @@ async def confirm(channel, title, description, message="", custom_prefix="", cal
{
"
emoji
"
:
"
👍
"
,
"
custom_id
"
:
f
"
{
custom_prefix
}
_yes
"
,
"
style
"
:
ButtonStyle
.
green
},
{
"
emoji
"
:
"
👎
"
,
"
custom_id
"
:
f
"
{
custom_prefix
}
_no
"
,
"
style
"
:
ButtonStyle
.
red
},
]))
def
date_to_string
(
date
:
datetime
):
return
date
.
strftime
(
DATE_TIME_FMT
)
def
date_from_string
(
date
:
str
):
return
datetime
.
strptime
(
date
,
DATE_TIME_FMT
)
async
def
files_from_attachments
(
attachments
):
files
=
[]
for
attachment
in
attachments
:
files
.
append
(
await
attachment
.
to_file
(
spoiler
=
attachment
.
is_spoiler
()))
return
files
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment