-
+{% for contact in contacts: -%}
+
- {{ contact['name'] }} +{% endfor -%} +
diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..22930f4 --- /dev/null +++ b/.envrc @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +python3 -m venv .venv +source ./.venv/bin/activate +PATH_add .venv/bin +python3 -m pip install --upgrade pip diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..033df5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv +__pycache__ diff --git a/README.md b/README.md index e69de29..c915229 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,6 @@ +```shell +export DB_NAME=test +export DB_USER=test +export DB_PASSWORD=test +FLASK_APP=steam_chat_viewer flask run +``` diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..46bc436 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +flask +pg8000 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..b3c6e2f --- /dev/null +++ b/setup.py @@ -0,0 +1,6 @@ +from setuptools import find_packages, setup + +setup( + name="steam_chat_viewer", + packages=find_packages(), +) diff --git a/steam_chat_viewer/__init__.py b/steam_chat_viewer/__init__.py new file mode 100644 index 0000000..0da654f --- /dev/null +++ b/steam_chat_viewer/__init__.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 + +from os import environ +from flask import Flask, request, render_template + +from .pg import query, select + +app = Flask(__name__) + +@app.route('/') +def home(): + if 'filter' in request.args: + messages = select( + ''' + SELECT * FROM messages + WHERE from_url = :filter + OR to_url = :filter + ORDER BY date DESC + ''', + filter=request.args['filter'] + ) + else: + messages = select( + ''' + SELECT * FROM messages + ORDER BY date DESC + LIMIT 1000 + ''' + ) + + return render_template( + "home.html", + contacts=select( + ''' + SELECT DISTINCT ON (url) url, name + FROM ( + ( + SELECT DISTINCT ON (from_url) from_url as url, from_name as name + FROM messages + ORDER BY url, date DESC + ) + UNION + ( + SELECT DISTINCT ON (to_url) to_url as url, to_name as name + FROM messages + ORDER BY url, date DESC + ) + ) as nested; + ''' + ), + messages=messages, + ) diff --git a/steam_chat_viewer/pg.py b/steam_chat_viewer/pg.py new file mode 100644 index 0000000..42da2be --- /dev/null +++ b/steam_chat_viewer/pg.py @@ -0,0 +1,32 @@ +from os import environ +from collections import namedtuple +import pg8000 + +from flask import g + +def db(): + if not hasattr(g, 'db_connection'): + g.db_connection = pg8000.connect( + host=environ['DB_HOST'], + database=environ['DB_NAME'], + user=environ['DB_USER'], + password=environ['DB_PASSWORD'], + ) + + return g.db_connection + +def query(querystring, **params): + try: + cursor = db().cursor() + cursor.paramstyle = "named" + cursor.execute(querystring, params) + db().commit() + return cursor + except: + db().rollback() + raise + +def select(querystring, **params): + cursor = query(querystring, **params) + columns = [x[0] for x in cursor.description] + return [dict(zip(columns, row)) for row in cursor.fetchall()] diff --git a/steam_chat_viewer/static/icon.svg b/steam_chat_viewer/static/icon.svg new file mode 100644 index 0000000..e69de29 diff --git a/steam_chat_viewer/static/script.js b/steam_chat_viewer/static/script.js new file mode 100644 index 0000000..e69de29 diff --git a/steam_chat_viewer/static/style.css b/steam_chat_viewer/static/style.css new file mode 100644 index 0000000..e69de29 diff --git a/steam_chat_viewer/templates/home.html b/steam_chat_viewer/templates/home.html new file mode 100644 index 0000000..bd9a448 --- /dev/null +++ b/steam_chat_viewer/templates/home.html @@ -0,0 +1,35 @@ + + +
+