Skip to content

Commit cb207e3

Browse files
committed
Add challenge editing stuff
1 parent e8c3a40 commit cb207e3

25 files changed

+477
-44
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""Add challenge creation_date
2+
3+
Revision ID: 38188dd2243f
4+
Revises: b0df6f4097b7
5+
Create Date: 2020-09-19 06:34:59.966877
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
import sqlalchemy_utils
11+
12+
13+
# revision identifiers, used by Alembic.
14+
revision = '38188dd2243f'
15+
down_revision = 'b0df6f4097b7'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
# ### commands auto generated by Alembic - please adjust! ###
22+
op.add_column('challenges', sa.Column('creation_date', sa.DateTime(), server_default=sa.text('now()'), nullable=False))
23+
# ### end Alembic commands ###
24+
25+
26+
def downgrade():
27+
# ### commands auto generated by Alembic - please adjust! ###
28+
op.drop_column('challenges', 'creation_date')
29+
# ### end Alembic commands ###

luhack_bot/cogs/challenges.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
import logging
23
import textwrap
34
from typing import List, Tuple, TypeVar
@@ -88,17 +89,6 @@ async def challenges(self, ctx, challenge_title: Optional[str]):
8889

8990
await ctx.send(self.format_challenge(challenge))
9091

91-
@challenges.command()
92-
async def add_debug(self, ctx, title: str, content: str, flag: str):
93-
challenge = await Challenge.create_auto(
94-
title=title,
95-
content=content,
96-
flag=flag,
97-
points=10,
98-
)
99-
100-
await ctx.send(self.format_challenge(challenge))
101-
10292
@challenges.command(aliases=["top10"])
10393
async def leaderboard(self, ctx):
10494
"""View the leaderboard for completed challenges."""
@@ -217,6 +207,18 @@ async def claim(self, ctx, flag: str):
217207
+ warn_dm_message
218208
)
219209

210+
embed = discord.Embed(
211+
title=f"Challenge Solved!",
212+
description=f"{ctx.author.mention} just solved '{challenge.title}' and was awarded '{challenge.points}' points.",
213+
color=discord.Colour.dark_teal(),
214+
timestamp=datetime.utcnow(),
215+
url=str(self.challenge_url(challenge.slug)),
216+
)
217+
embed.set_author(name=ctx.author.display_name, icon_url=ctx.author.avatar_url_as(format="png"))
218+
channel = ctx.bot.luhack_guild().get_channel(constants.challenge_log_channel_id)
219+
if channel is not None:
220+
await channel.send(embed=embed)
221+
220222

221223
def setup(bot):
222224
bot.add_cog(Challenges(bot))

luhack_bot/cogs/writeups.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ async def delete(self, ctx, *, title: str):
128128
await writeup.delete()
129129
await ctx.send(f"RIP {writeup.title}")
130130

131-
@writeups.command(aliases=["link"])
132-
async def token(self, ctx):
133-
"""Generate a token allowing you to create writeups & manage those you have authority to."""
131+
@commands.command(aliases=["site_link"])
132+
async def site_token(self, ctx):
133+
"""Generate a token allowing you to create/edit writeups (and blogs/challenges for disciples)."""
134134

135135
member_in_luhack = self.bot.luhack_guild().get_member(ctx.author.id)
136136

@@ -145,7 +145,8 @@ async def token(self, ctx):
145145
url = constants.writeups_base_url.with_query(token=token)
146146

147147
await ctx.author.send(
148-
f"Visit this link and you'll be authed for 24 hours: {url}"
148+
f"Visit this link and you'll be authed for a month: {url}"
149149
)
150+
150151
def setup(bot):
151152
bot.add_cog(Writeups(bot))

luhack_bot/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ def env_fail(var: str):
2424
master_cyber_wizard_role_id,
2525
}
2626
bot_log_channel_id = 588443109994528816
27+
challenge_log_channel_id = 576418418211684393
2728
inner_magic_circle_id = 631618075254325257
2829
writeups_base_url = yarl.URL("https://scc-luhack.lancs.ac.uk/writeups")
2930
challenges_base_url = yarl.URL("https://scc-luhack.lancs.ac.uk/challenges")

luhack_bot/db/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ class Challenge(db.Model):
169169
completed_users = relationship(User, secondary=lambda: CompletedChallenge,
170170
back_populates="users")
171171

172+
creation_date = db.Column(db.DateTime, server_default=func.now(), nullable=False)
173+
172174
@classmethod
173175
def create_auto(cls, *args, **kwargs):
174176
if "slug" not in kwargs:

luhack_bot/token_tools.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ def decode_writeup_edit_token(token: str) -> Optional[Tuple[str, int, bool]]:
3838
"""Decode a writeup edit token, returns a tuple of the user id and if they are
3939
admin if the token was valid, None otherwise.
4040
41-
Writeup edit tokens have a max age of 24h.
41+
Writeup edit tokens have a max age of a month.
4242
"""
4343

4444
try:
45-
data = token_signer.loads(token, max_age=24 * 60 * 60)
45+
data = token_signer.loads(token, max_age=31 * 24 * 60 * 60)
4646
return (data["username"], data["user_id"], data["is_admin"])
4747
except BadSignature:
4848
return None

luhack_site/blog.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from itertools import groupby
22
from textwrap import shorten
33
from typing import List, Tuple
4-
from datetime import datetime
54
import calendar
65

76
import sqlalchemy as sa
@@ -11,10 +10,9 @@
1110
from starlette.authentication import requires
1211
from starlette.endpoints import HTTPEndpoint
1312
from starlette.requests import HTTPConnection
14-
from starlette.responses import RedirectResponse
1513
from starlette.routing import Router
1614

17-
from luhack_site.utils import abort
15+
from luhack_site.utils import abort, redirect_response
1816
from luhack_site.authorization import can_edit
1917
from luhack_site.forms import PostForm
2018
from luhack_site.markdown import highlight_markdown, plaintext_markdown
@@ -44,7 +42,7 @@ def group_yearly(blogs):
4442

4543
@router.route("/")
4644
async def blog_index(request: HTTPConnection):
47-
latest = await Blog.query.order_by(sa.desc(Blog.creation_date)).limit(20).gino.all()
45+
latest = await Blog.query.order_by(sa.desc(Blog.creation_date)).gino.all()
4846

4947
rendered = [
5048
(w, shorten(plaintext_markdown(w.content), width=800, placeholder="..."))
@@ -180,9 +178,9 @@ async def blog_delete(request: HTTPConnection):
180178
return abort(400)
181179

182180
await blog.delete()
183-
await log_delete("blog", blog.name, request.user.username)
181+
await log_delete("blog", blog.title, request.user.username)
184182

185-
return RedirectResponse(url=request.url_for("blog_index"))
183+
return redirect_response(url=request.url_for("blog_index"))
186184

187185

188186
@router.route("/new")
@@ -227,9 +225,9 @@ async def post(self, request: HTTPConnection):
227225
)
228226

229227
url = request.url_for("blog_view", slug=blog.slug)
230-
await log_create("blog", blog.name, request.user.username, url)
228+
await log_create("blog", blog.title, request.user.username, url)
231229

232-
return RedirectResponse(url=url)
230+
return redirect_response(url=url)
233231

234232
images = await encoded_existing_images(request)
235233
tags = ujson.dumps(await get_all_tags())
@@ -297,9 +295,9 @@ async def post(self, request: HTTPConnection):
297295
).apply()
298296

299297
url = request.url_for("blog_view", slug=blog.slug)
300-
await log_edit("blog", blog.name, request.user.username, url)
298+
await log_edit("blog", blog.title, request.user.username, url)
301299

302-
return RedirectResponse(url=url)
300+
return redirect_response(url=url)
303301

304302
images = await encoded_existing_images(request)
305303
tags = ujson.dumps(await get_all_tags())

0 commit comments

Comments
 (0)