added database support
This commit is contained in:
parent
4c526cb1e7
commit
f2446bf0c4
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
||||||
|
__pycache__/
|
||||||
*.cfg
|
*.cfg
|
||||||
*.swp
|
*.swp
|
||||||
__pycache__/
|
secret_key
|
||||||
|
db_key
|
||||||
|
|
17
README.md
17
README.md
|
@ -3,7 +3,22 @@ By popular demand, I'm building a better anonkun. It doesn't do much right now t
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
Python 3.6+
|
Python 3.6+
|
||||||
Python packages: `flask flask_socketio`
|
MariaDB 10.2+
|
||||||
|
Python packages: `flask flask_socketio flask-paranoid passlib argon2_cffi`
|
||||||
|
|
||||||
|
## Install
|
||||||
|
```
|
||||||
|
$ mysql -u root -p
|
||||||
|
mysql> CREATE DATABASE `anonkun` DEFAULT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;
|
||||||
|
mysql> CREATE USER `anonkun`@'localhost' IDENTIFIED BY 'password';
|
||||||
|
mysql> GRANT ALL PRIVILEGES ON `anonkun`.* TO `anonkun`@`localhost`;
|
||||||
|
mysql> \q
|
||||||
|
```
|
||||||
|
1. Get on the floor
|
||||||
|
2. Walk the dinosaur
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
`gunicorn -b localhost:5050 --worker-class eventlet anonkun:app`
|
||||||
|
|
||||||
## Todo
|
## Todo
|
||||||
Rename this project to something that doesn't mean "shit" in weebspeak.
|
Rename this project to something that doesn't mean "shit" in weebspeak.
|
||||||
|
|
53
anonkun.py
53
anonkun.py
|
@ -8,6 +8,8 @@ import time
|
||||||
from flask import Flask, session, request, abort, redirect, url_for, g, \
|
from flask import Flask, session, request, abort, redirect, url_for, g, \
|
||||||
render_template
|
render_template
|
||||||
from flask_socketio import SocketIO, emit, join_room
|
from flask_socketio import SocketIO, emit, join_room
|
||||||
|
from flask_paranoid import Paranoid
|
||||||
|
import MySQLdb
|
||||||
|
|
||||||
class ReverseProxied(object):
|
class ReverseProxied(object):
|
||||||
"""
|
"""
|
||||||
|
@ -46,9 +48,52 @@ class ReverseProxied(object):
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.wsgi_app = ReverseProxied(app.wsgi_app)
|
app.wsgi_app = ReverseProxied(app.wsgi_app)
|
||||||
app.config['SECRET_KEY'] = 'secret!'
|
|
||||||
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
|
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
|
||||||
socketio = SocketIO(app)
|
socketio = SocketIO(app)
|
||||||
|
paranoid = Paranoid(app)
|
||||||
|
paranoid.redirect_view = 'index'
|
||||||
|
|
||||||
|
|
||||||
|
def db_execute(*args, **kwargs):
|
||||||
|
"""
|
||||||
|
Opens a connection to the app's database and executes the SQL statements
|
||||||
|
passed to this function.
|
||||||
|
"""
|
||||||
|
passwd = app.config.get("DB_KEY")
|
||||||
|
with MySQLdb.connect(user="anonkun", passwd=passwd, db="anonkun") as cur:
|
||||||
|
cur.execute(*args, **kwargs)
|
||||||
|
return cur
|
||||||
|
|
||||||
|
|
||||||
|
def init():
|
||||||
|
"""
|
||||||
|
Initializes the application.
|
||||||
|
"""
|
||||||
|
# init secret key
|
||||||
|
if os.path.exists("secret_key"):
|
||||||
|
with open("secret_key", "rb") as file:
|
||||||
|
secret_key = file.read()
|
||||||
|
else:
|
||||||
|
secret_key = os.urandom(64)
|
||||||
|
with open("secret_key", "wb") as file:
|
||||||
|
file.write(secret_key)
|
||||||
|
app.secret_key = secret_key
|
||||||
|
|
||||||
|
# init db
|
||||||
|
with open("db_key", "r") as file:
|
||||||
|
passwd = file.read().strip() # TODO: encrypt this
|
||||||
|
app.config["DB_KEY"] = passwd
|
||||||
|
try:
|
||||||
|
db_execute("SELECT * FROM `users`").fetchone()
|
||||||
|
except MySQLdb.ProgrammingError: # database not initialized
|
||||||
|
with open("anonkun.sql", "r") as file:
|
||||||
|
commands = file.read().split(";")
|
||||||
|
for cmd in commands:
|
||||||
|
cmd = cmd.strip()
|
||||||
|
if not cmd:
|
||||||
|
continue
|
||||||
|
db_execute(cmd)
|
||||||
|
|
||||||
|
|
||||||
@socketio.on('joined', namespace="/chat")
|
@socketio.on('joined', namespace="/chat")
|
||||||
def joined(data):
|
def joined(data):
|
||||||
|
@ -57,7 +102,6 @@ def joined(data):
|
||||||
"""
|
"""
|
||||||
room = data["room"]
|
room = data["room"]
|
||||||
join_room(room)
|
join_room(room)
|
||||||
print("Client connected.")
|
|
||||||
|
|
||||||
|
|
||||||
@socketio.on('message', namespace="/chat")
|
@socketio.on('message', namespace="/chat")
|
||||||
|
@ -100,3 +144,8 @@ def index():
|
||||||
The index page.
|
The index page.
|
||||||
"""
|
"""
|
||||||
return render_template("index.html")
|
return render_template("index.html")
|
||||||
|
|
||||||
|
|
||||||
|
init()
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host='0.0.0.0', port=5050)
|
||||||
|
|
23
anonkun.sql
Normal file
23
anonkun.sql
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
CREATE TABLE `users` (
|
||||||
|
`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`username` VARCHAR(20) NOT NULL,
|
||||||
|
`password_hash` CHAR(73) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB CHARSET utf8mb4;
|
||||||
|
|
||||||
|
CREATE TABLE `quests` (
|
||||||
|
`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`canon_title` VARCHAR(300) DEFAULT NULL,
|
||||||
|
`ident_title` VARCHAR(300) DEFAULT NULL,
|
||||||
|
`owner_id` SMALLINT UNSIGNED DEFAULT NULL,
|
||||||
|
`quest_data` MEDIUMTEXT DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB CHARSET utf8mb4;
|
||||||
|
|
||||||
|
CREATE TABLE `chat_messages` (
|
||||||
|
`room_id` SMALLINT UNSIGNED NOT NULL,
|
||||||
|
`name` VARCHAR(20) NOT NULL,
|
||||||
|
`name_id` SMALLINT UNSIGNED DEFAULT NULL,
|
||||||
|
`date` INT UNSIGNED NOT NULL,
|
||||||
|
`message` TEXT NOT NULL
|
||||||
|
) ENGINE=InnoDB CHARSET utf8mb4;
|
|
@ -47,7 +47,6 @@
|
||||||
<div id="questBody">
|
<div id="questBody">
|
||||||
<h1>Unga Bunga Quest</h1>
|
<h1>Unga Bunga Quest</h1>
|
||||||
|
|
||||||
|
|
||||||
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eget ullamcorper orci. Proin feugiat nibh quam, ut cursus nulla varius et. Integer a massa magna. Pellentesque euismod luctus congue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin eu urna dapibus, accumsan diam nec, consectetur odio. Integer porta dignissim odio, non laoreet orci hendrerit et. Donec vitae egestas ligula, ut accumsan tortor.
|
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eget ullamcorper orci. Proin feugiat nibh quam, ut cursus nulla varius et. Integer a massa magna. Pellentesque euismod luctus congue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin eu urna dapibus, accumsan diam nec, consectetur odio. Integer porta dignissim odio, non laoreet orci hendrerit et. Donec vitae egestas ligula, ut accumsan tortor.
|
||||||
|
|
||||||
<p>Cras pretium nibh et nunc pretium gravida. Integer imperdiet ipsum in felis porttitor consectetur. Vivamus accumsan tempus sem. Aliquam sit amet eleifend metus, non hendrerit urna. Etiam commodo mattis erat et interdum. Nullam sit amet fermentum mauris. Sed porta sed odio in mollis. Donec id malesuada felis. Cras eu risus gravida, mollis arcu sit amet, rhoncus elit. Nunc suscipit odio ac leo tristique, vel aliquet sapien porttitor. Vivamus nec ante vitae nulla efficitur dapibus sit amet at risus. Vestibulum lobortis cursus venenatis. Ut sapien augue, condimentum nec blandit ac, convallis id metus. Pellentesque convallis vel turpis et dapibus. Aenean ex velit, ornare et nisi ac, tempor tempor augue.
|
<p>Cras pretium nibh et nunc pretium gravida. Integer imperdiet ipsum in felis porttitor consectetur. Vivamus accumsan tempus sem. Aliquam sit amet eleifend metus, non hendrerit urna. Etiam commodo mattis erat et interdum. Nullam sit amet fermentum mauris. Sed porta sed odio in mollis. Donec id malesuada felis. Cras eu risus gravida, mollis arcu sit amet, rhoncus elit. Nunc suscipit odio ac leo tristique, vel aliquet sapien porttitor. Vivamus nec ante vitae nulla efficitur dapibus sit amet at risus. Vestibulum lobortis cursus venenatis. Ut sapien augue, condimentum nec blandit ac, convallis id metus. Pellentesque convallis vel turpis et dapibus. Aenean ex velit, ornare et nisi ac, tempor tempor augue.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user