Some progress with moving over to sql keyval

This commit is contained in:
Jeremy Zhang 2017-04-23 23:02:03 -07:00
parent b3a219e58d
commit a212ca1052
6 changed files with 65 additions and 26 deletions

View File

@ -15,7 +15,7 @@ app.config['SQLALCHEMY_DATABASE_URI'] = config['database-uri']
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # Suppress the warning/no need this on for now.
app.config['RATELIMIT_HEADERS_ENABLED'] = True
app.config['SQLALCHEMY_POOL_RECYCLE'] = 250
app.config['RATELIMIT_STORAGE_URL'] = 'redislite://redislite.db'
app.config['RATELIMIT_STORAGE_URL'] = 'keyvalprops://'
app.secret_key = config['app-secret']
db.init_app(app)
@ -29,9 +29,3 @@ app.register_blueprint(blueprints.embed.embed, url_prefix="/embed", template_fol
@app.route("/")
def index():
return render_template("index.html.j2")
@app.route("/oldembed/<guildid>/<channelid>")
def embed_get(guildid, channelid):
if 'username' not in session:
return redirect(url_for("get_set_username", guildid=guildid, channelid=channelid))
return render_template("embed.html")

View File

@ -23,10 +23,10 @@ def get_logingreeting():
def guild_embed(guild_id):
if check_guild_existance(guild_id):
guild = discord_api.get_guild(guild_id)['content']
return render_template("embed.html.j2",
login_greeting=get_logingreeting(),
guild_id=guild_id, guild=guild,
generate_guild_icon=generate_guild_icon_url,
return render_template("embed.html.j2",
login_greeting=get_logingreeting(),
guild_id=guild_id, guild=guild,
generate_guild_icon=generate_guild_icon_url,
unauth_enabled=guild_query_unauth_users_bool(guild_id),
client_id=config['client-id']
)
@ -38,4 +38,4 @@ def signin_complete():
@embed.route("/login_discord")
def login_discord():
return redirect(url_for("user.login_authenticated", redirect=url_for("embed.signin_complete", _external=True)))
return redirect(url_for("user.login_authenticated", redirect=url_for("embed.signin_complete", _external=True)))

View File

@ -1,10 +1,9 @@
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from guilds import Guilds
from unauthenticated_users import UnauthenticatedUsers
from unauthenticated_bans import UnauthenticatedBans
from authenticated_users import AuthenticatedUsers
from custom_redislite import LimitsRedisLite
from keyvalue_properties import set_keyvalproperty, get_keyvalproperty, getexpir_keyvalproperty, setexpir_keyvalproperty
from keyvalue_properties import KeyValueProperties, set_keyvalproperty, get_keyvalproperty, getexpir_keyvalproperty, setexpir_keyvalproperty, ifexists_keyvalproperty, delete_keyvalproperty

View File

@ -1,5 +1,7 @@
from titanembeds.database import db
from datetime import datetime
from datetime import datetime, timedelta
from limits.storage import Storage
import time
def set_keyvalproperty(key, value, expiration=None):
q = db.session.query(KeyValueProperties).filter(KeyValueProperties.key == key)
@ -22,8 +24,10 @@ def getexpir_keyvalproperty(key):
q = db.session.query(KeyValueProperties).filter(KeyValueProperties.key == key)
now = datetime.now()
if q.count() > 0 and (q.first().expiration is not None and q.first().expiration > now):
return q.first().expiration
return None
print q.first().expiration
print datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return int(q.first().expiration.strftime('%s'))
return 0
def setexpir_keyvalproperty(key, expiration=None):
q = db.session.query(KeyValueProperties).filter(KeyValueProperties.key == key)
@ -34,10 +38,20 @@ def setexpir_keyvalproperty(key, expiration=None):
q.first().expiration = None
db.session.commit()
def ifexists_keyvalproperty(key):
q = db.session.query(KeyValueProperties).filter(KeyValueProperties.key == key)
return q.count() > 0
def delete_keyvalproperty(key):
q = db.session.query(KeyValueProperties).filter(KeyValueProperties.key == key).first()
if q:
db.session.delete(q)
db.session.commit()
class KeyValueProperties(db.Model):
__tablename__ = "keyvalue_properties"
id = db.Column(db.Integer, primary_key=True) # Auto incremented id
key = db.Column(db.String(32)) # Property Key
key = db.Column(db.String(255)) # Property Key
value = db.Column(db.Text()) # Property value
expiration = db.Column(db.TIMESTAMP) # Suggested Expiration for value (None = no expire) in secs
@ -45,6 +59,38 @@ class KeyValueProperties(db.Model):
self.key = key
self.value = value
if expiration:
self.expiration = datetime.datetime.now() + datetime.timedelta(seconds = expiration)
self.expiration = datetime.now() + timedelta(seconds = expiration)
else:
self.expiration = None
class LimitsKeyValueProperties(Storage): # For Python Limits
STORAGE_SCHEME = "keyvalprops"
def __init__(self, uri, **options):
pass
def check(self):
return True
def get_expiry(self, key):
return getexpir_keyvalproperty(key) + time.time()
def incr(self, key, expiry, elastic_expiry=False):
if not ifexists_keyvalproperty(key):
set_keyvalproperty(key, 1, expiration=expiry)
else:
oldexp = getexpir_keyvalproperty(key) - time.time()
if oldexp <= 0:
delete_keyvalproperty(key)
return self.incr(key, expiry, elastic_expiry)
set_keyvalproperty(key, int(get_keyvalproperty(key))+1, expiration=int(round(oldexp)))
return int(self.get(key))
def get(self, key):
value = get_keyvalproperty(key)
if value:
return int(value)
return 0
def reset(self):
return False

View File

@ -4,7 +4,7 @@ import time
import json
from functools import partial
from titanembeds.utils import cache
from redislite import Redis
from titanembeds.database import db, KeyValueProperties, get_keyvalproperty, set_keyvalproperty
_DISCORD_API_BASE = "https://discordapp.com/api/v6"
@ -19,21 +19,21 @@ class DiscordREST:
self.global_redis_prefix = "discordapiratelimit/"
self.bot_token = bot_token
self.user_agent = "TitanEmbeds (https://github.com/EndenDragon/Titan) Python/{} requests/{}".format(sys.version_info, requests.__version__)
self.rate_limit_bucket = Redis("redislite.db")
if not self._bucket_contains("global_limited"):
self._set_bucket("global_limited", False)
self._set_bucket("global_limit_expire", 0)
def _get_bucket(self, key):
value = self.rate_limit_bucket.get(self.global_redis_prefix + key)
value = get_keyvalproperty(self.global_redis_prefix + key)
return value
def _set_bucket(self, key, value):
return self.rate_limit_bucket.set(self.global_redis_prefix + key, value)
#set_keyvalproperty("", "")
return ""#set_keyvalproperty(self.global_redis_prefix + key, value)
def _bucket_contains(self, key):
return self.rate_limit_bucket.exists(self.global_redis_prefix + key)
return ""#ifexists_keyvalproperty(self.global_redis_prefix + key)
def request(self, verb, url, **kwargs):
headers = {

View File

@ -1,6 +1,6 @@
from beaker.cache import CacheManager
from beaker.util import parse_cache_config_options
from titanembeds.database import db, Guilds
from titanembeds.database import db, Guilds, KeyValueProperties
from flask import request, session
from flask_limiter import Limiter
from config import config