Skip to content

Commit 102a56f

Browse files
committed
spoiler functions to encode and decode chat messages
closes #152
1 parent a36238e commit 102a56f

10 files changed

Lines changed: 95 additions & 3 deletions

File tree

sopy/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def create_app(info=None):
3030

3131
views.init_app(app)
3232

33-
from sopy import auth, tags, se_data, canon, salad, wiki, pages, admin, transcript
33+
from sopy import auth, tags, se_data, canon, salad, wiki, pages, admin, transcript, spoiler
3434

3535
app.register_blueprint(auth.bp, url_prefix='/auth')
3636
app.register_blueprint(tags.bp, url_prefix='/tags')
@@ -41,6 +41,7 @@ def create_app(info=None):
4141
app.register_blueprint(pages.bp, url_prefix='/pages')
4242
app.register_blueprint(admin.bp, url_prefix='/admin')
4343
app.register_blueprint(transcript.bp, url_prefix='/transcript')
44+
app.register_blueprint(spoiler.bp, url_prefix='/spoiler')
4445

4546
@app.route('/')
4647
def index():

sopy/config/defaults.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
DEBUG = True
22
SECRET_KEY = 'dev'
3+
SERVER_NAME = 'localhost:5000'
34

45
SQLALCHEMY_DATABASE_URI = 'postgresql:///sopy'
56
SQLALCHEMY_TRACK_MODIFICATIONS = False

sopy/ext/forms.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import re
22
from flask import request
3-
from wtforms import Field, Form as BaseForm, IntegerField, StringField
3+
from wtforms import Field, Form as BaseForm, IntegerField, StringField, TextAreaField
44
from wtforms.widgets import TextInput
55

66

@@ -14,6 +14,10 @@ def process_formdata(self, valuelist):
1414
self.raw_data = []
1515

1616

17+
class StripTextAreaField(StripStringField, TextAreaField):
18+
pass
19+
20+
1721
class SeparatedField(Field):
1822
widget = TextInput()
1923

sopy/spoiler/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from flask import Blueprint
2+
3+
bp = Blueprint('spoiler', __name__)
4+
5+
6+
@bp.record_once
7+
def register(state):
8+
from sopy.spoiler import views

sopy/spoiler/forms.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from flask_wtf import Form
2+
from wtforms.validators import InputRequired
3+
from sopy.ext.forms import StripTextAreaField
4+
5+
6+
class SpoilerForm(Form):
7+
message = StripTextAreaField(validators=[InputRequired()])

sopy/spoiler/views.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from base64 import urlsafe_b64encode, urlsafe_b64decode
2+
from flask import render_template, url_for
3+
from sopy.spoiler import bp
4+
from sopy.spoiler.forms import SpoilerForm
5+
6+
7+
@bp.route('/', methods=['GET', 'POST'])
8+
def encode():
9+
form = SpoilerForm(csrf_enabled=False)
10+
11+
if form.validate_on_submit():
12+
message = form.message.data
13+
encoded = urlsafe_b64encode(message.encode('utf8')).decode('utf8')
14+
url = url_for('.decode', encoded=encoded, _external=True)
15+
return render_template('spoiler/encode.html', form=form, encoded=encoded, message=message, url=url)
16+
17+
return render_template('spoiler/encode.html', form=form)
18+
19+
20+
@bp.route('/<path:encoded>')
21+
def decode(encoded):
22+
message = urlsafe_b64decode(encoded).decode('utf8')
23+
return render_template('spoiler/decode.html', encoded=encoded, message=message)

sopy/templates/pages/chatroom.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ <h2 class="page-header">{% block title %}Chatroom{% endblock %}</h2>
2020
you may want to <a href="{{ url_for('salad.index') }}">have a look here...</a></em>
2121
</p>
2222

23+
<p>Use our <a href="{{ url_for('spoiler.encode') }}">spoiler obfuscator</a> to link to spoilers in chat.</p>
24+
2325
<h2>cv-pls</h2>
2426
<p>This room has its own policy as to how <code>cv-pls</code> tags should be used. Please take a moment to read it <a href="{{ url_for('wiki.detail', title='cv-pls') }}">here</a> if you wish to assist the community in clearing up the site.</p>
2527

26-
2728
<h2>Rules</h2>
2829

2930
<ol>

sopy/templates/spoiler/base.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% extends 'base.html' %}
2+
3+
{% block nav_spoiler %}active{% endblock %}

sopy/templates/spoiler/decode.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{% extends 'salad/base.html' %}
2+
3+
{% block title %}View Spoiler{% endblock %}
4+
5+
{% block content %}
6+
<div class="well well-sm">{{ message|markdown }}</div>
7+
{% endblock %}

sopy/templates/spoiler/encode.html

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{% extends 'salad/base.html' %}
2+
3+
{% set script_ace = True %}
4+
5+
{% block title %}Spoiler Obfuscator{% endblock %}
6+
7+
{% block content %}
8+
<div class="row"><div class="col-md-12">
9+
<form method="post" class="form-horizontal">
10+
<div class="form-group">
11+
{{ form.message.label(class='control-label col-md-2') }}
12+
<div class="col-md-10">{{ form.message(class='form-control', data_editor='markdown') }}</div>
13+
</div>
14+
<div class="form-group"><div class="col-md-offset-2 col-md-10">
15+
<button type="submit" class="btn btn-primary"><i class="fa fa-eye-slash"></i> Encode</button>
16+
</div></div>
17+
</form>
18+
</div>
19+
{% if encoded %}<div class="col-md-12">
20+
<dl class="dl-horizontal">
21+
<dt>URL</dt>
22+
<dd>{{ url|urlize(40) }}</dd>
23+
<dt>Markup</dt>
24+
<dd><pre>[view spoiler]({{ url }})</pre></dd>
25+
</dl>
26+
<ul class="nav nav-tabs">
27+
<li class="active"><a href="#output-rendered" data-toggle="tab">Rendered</a></li>
28+
<li><a href="#output-raw" data-toggle="tab">Raw</a></li>
29+
<li><a href="#output-encoded" data-toggle="tab">Encoded</a></li>
30+
</ul>
31+
<div class="tab-content">
32+
<div class="tab-pane active" id="output-rendered"><br/><div class="well well-sm">{{ message|markdown }}</div></div>
33+
<div class="tab-pane" id="output-raw"><br/><pre>{{ message }}</pre></div>
34+
<div class="tab-pane" id="output-encoded"><br/><pre>{{ encoded }}</pre></div>
35+
</div>
36+
</div>{% endif %}</div>
37+
{% endblock %}

0 commit comments

Comments
 (0)