-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
88 lines (72 loc) · 2.45 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import hashlib
import re
from datetime import date, timedelta
from flask import Flask, render_template, request, abort
from jinja2.utils import urlize
from sqlalchemy import asc, desc
from sqlalchemy.orm import joinedload
from quassel import quassel_session, Message, Buffer, Sender, Network
import settings
app = Flask(__name__)
app.config["PROPAGATE_EXCEPTIONS"] = True
## Quassel Connection
session = quassel_session(settings.uri)
def hash_nick(nick):
hash = hashlib.sha1(nick.encode("utf-8"))
return int(hash.hexdigest(), 16)
def process_message(message):
# NOTE: Working around jinja2.utils.urlize being far too greedy on matches
if not message:
return ""
message = message.replace("\x0f", " \x0f")
message = urlize(message)
message = message.replace(" \x0f", "\x0f")
message = re.sub("\x03(\\d\\d)", r'<span class="color\1">', message)
message = message.replace("\x03", "</span>")
message = message.replace("\x0f", "</b></em></u></span>") # Nasty.
while "\x02" in message:
message = message.replace("\x02", "<b>", 1)
message = message.replace("\x02", "</b>", 1)
while "\x1d" in message:
message = message.replace("\x1d", "<em>", 1)
message = message.replace("\x1d", "</em>", 1)
while "\x1f" in message:
message = message.replace("\x1f", "<u>", 1)
message = message.replace("\x1f", "</u>", 1)
return message
@app.route("/<name>/")
def channel_index(name):
if name not in settings.channels:
abort(404)
days = request.args.get("days", "")
if days.isdigit():
days = min(int(days), 200)
else:
days = settings.days
query = session.query(Message).join(Sender)
query = query.order_by(asc(Message.time))
query = query.filter(Message.time >= date.today() - timedelta(days))
#query = query.options(joinedload(Message.sender))
#query = query.options(joinedload(Message.buffer))
query = query.join(Message.buffer)
query = query.filter(Buffer.userid == 1)
channel_name = "#" + name # XXX
query = query.filter(Buffer.name == channel_name)
nick = request.args.get("nick")
if nick:
query = query.filter(Sender.name.startswith(nick))
search = request.args.get("search")
if search:
query = query.filter(Message.message.contains(search))
context = {
"channel": channel_name,
"highlight": request.args.get("highlight", "").lower(),
"messages": list(query),
"hash": hash_nick,
"process_message": process_message,
}
return render_template("backlog.html", **context)
if __name__ == "__main__":
app.debug = True
app.run()
session.close()