|
|
@ -1,9 +1,10 @@ |
|
|
|
from flask import Flask, request, render_template, send_from_directory, abort, redirect |
|
|
|
from flask import Flask, request, render_template, send_from_directory, abort, redirect, session |
|
|
|
from flask_sqlalchemy import SQLAlchemy |
|
|
|
from flask_limiter import Limiter |
|
|
|
from flask_limiter.util import get_remote_address |
|
|
|
from mastodon import Mastodon |
|
|
|
import re |
|
|
|
import random |
|
|
|
from datetime import datetime |
|
|
|
from dateutil.tz import tzlocal |
|
|
|
import html2text |
|
|
@ -11,6 +12,7 @@ from config import C |
|
|
|
|
|
|
|
app = Flask(__name__) |
|
|
|
app.config.from_object('config.C') |
|
|
|
app.secret_key = C.session_key |
|
|
|
|
|
|
|
th = Mastodon( |
|
|
|
access_token = C.token, |
|
|
@ -35,11 +37,12 @@ class Candidate(db.Model): |
|
|
|
url = db.Column(db.String(50)) |
|
|
|
time = db.Column(db.DateTime) |
|
|
|
toot = db.Column(db.BigInteger) |
|
|
|
likeNum = db.Column(db.Integer, default=0) |
|
|
|
|
|
|
|
class Like(db.Model): |
|
|
|
id = db.Column(db.Integer, primary_key=True) |
|
|
|
cid = db.Column(db.Integer) |
|
|
|
ip = db.Column(db.String(45)) |
|
|
|
uid = db.Column(db.Integer) |
|
|
|
|
|
|
|
db.create_all() |
|
|
|
|
|
|
@ -47,16 +50,28 @@ db.create_all() |
|
|
|
def send_img(path): |
|
|
|
return send_from_directory('static/img', path) |
|
|
|
|
|
|
|
@app.route('/ordinary/set_session') |
|
|
|
@limiter.limit("3 / hour; 1 / 5 minute") |
|
|
|
def set_session(): |
|
|
|
if 'uid' not in session: |
|
|
|
session['uid'] = random.randint(0, 2000000000) |
|
|
|
return redirect('.') |
|
|
|
|
|
|
|
@app.route('/ordinary/') |
|
|
|
def can_list(): |
|
|
|
key = request.args.get('key') |
|
|
|
rip = request.remote_addr |
|
|
|
sort_by = request.args.get('sort_by', 'time') |
|
|
|
|
|
|
|
if 'uid' not in session: |
|
|
|
return redirect('set_session') |
|
|
|
uid = session['uid'] |
|
|
|
|
|
|
|
pag = Candidate.query.order_by(db.desc('id')).paginate(max_per_page=100) |
|
|
|
q = Candidate.query |
|
|
|
q = q.order_by(db.desc('likeNum')) if sort_by=='likeNum' else q.order_by(db.desc('id')) |
|
|
|
pag = q.paginate(max_per_page=100) |
|
|
|
|
|
|
|
def check_like(c): |
|
|
|
c.likeNum = Like.query.filter_by(cid=c.id).count() |
|
|
|
c.liked = 'liked' if Like.query.filter_by(ip=rip, cid=c.id).count() else 'like' |
|
|
|
c.liked = 'liked' if Like.query.filter_by(uid=uid, cid=c.id).count() else 'like' |
|
|
|
return c |
|
|
|
|
|
|
|
pag.items = map(check_like, pag.items) |
|
|
@ -66,12 +81,12 @@ def can_list(): |
|
|
|
'ques': ques, |
|
|
|
'hint': hint |
|
|
|
} for name, ques, hint, ans in C.verify |
|
|
|
] |
|
|
|
] |
|
|
|
|
|
|
|
return render_template('list.html', pagination=pag, vs=vs, showPrivate=(key==C.key)) |
|
|
|
return render_template('list.html', pagination=pag, vs=vs, showPrivate=(key==C.key), sort_by=sort_by, key=key) |
|
|
|
|
|
|
|
@app.route('/ordinary/new', methods=['POST']) |
|
|
|
@limiter.limit("3 / hour; 1 / 2 second") |
|
|
|
@limiter.limit("5 / hour; 1 / 2 second") |
|
|
|
def new_one(): |
|
|
|
|
|
|
|
content = request.form.get('text') |
|
|
@ -139,15 +154,17 @@ def like(toot): |
|
|
|
if not c: |
|
|
|
abort(404) |
|
|
|
|
|
|
|
rip = request.remote_addr |
|
|
|
if Like.query.filter_by(ip=rip, cid=c.id).first(): |
|
|
|
uid = session['uid'] |
|
|
|
if not uid: abort(401) |
|
|
|
if Like.query.filter_by(uid=uid, cid=c.id).first(): |
|
|
|
return '点赞过了', 403 |
|
|
|
|
|
|
|
l = Like(ip=rip, cid=c.id) |
|
|
|
l = Like(uid=uid, cid=c.id) |
|
|
|
c.likeNum += 1 |
|
|
|
db.session.add(l) |
|
|
|
db.session.commit() |
|
|
|
|
|
|
|
return str(Like.query.filter_by(cid=c.id).count()) |
|
|
|
return str(c.likeNum) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|