redo default home screen, show recently tipped memes

master
lza_menace 3 years ago
parent 9ec4d37448
commit be5bf5af76

@ -12,7 +12,7 @@ from suchwow import config
from suchwow.models import Post, Profile, Comment, Notification, db, Moderator from suchwow.models import Post, Profile, Comment, Notification, db, Moderator
from suchwow.routes import auth, comment, post, profile, leaderboard, api from suchwow.routes import auth, comment, post, profile, leaderboard, api
from suchwow.utils.decorators import login_required, moderator_required from suchwow.utils.decorators import login_required, moderator_required
from suchwow.utils.helpers import post_webhook, get_activity from suchwow.utils.helpers import post_webhook, get_latest_tipped_posts
from suchwow.reddit import make_post from suchwow.reddit import make_post
from suchwow.discord import post_discord_webhook from suchwow.discord import post_discord_webhook
from suchwow import wownero, filters from suchwow import wownero, filters
@ -38,6 +38,14 @@ def index():
submitter = request.args.get("submitter", None) submitter = request.args.get("submitter", None)
content = request.args.get("content", None) content = request.args.get("content", None)
if content != 'feed':
posts = get_latest_tipped_posts()
return render_template(
"index.html",
posts=posts[0:30],
title="Latest Tipped Memes"
)
try: try:
page = int(page) page = int(page)
except: except:
@ -54,9 +62,11 @@ def index():
"index.html", "index.html",
posts=paginated_posts, posts=paginated_posts,
page=page, page=page,
total_pages=total_pages total_pages=total_pages,
title="Latest Memes"
) )
@app.route("/mod") @app.route("/mod")
@moderator_required @moderator_required
def mod_queue(): def mod_queue():

@ -4,7 +4,13 @@
<div class="container" style="text-align:center;"> <div class="container" style="text-align:center;">
<h1 class="title">Latest Memes</h1> <h1 class="title">{% if title %}{{ title }}{% else %}Latest Memes{% endif %}</h1>
{% if request.args.content != 'feed' %}
<a href="/?content=feed">View Latest Memes</a>
{% else %}
<a href="/">View Latest Tipped Posts</a>
{% endif %}
<section class="section"> <section class="section">
{% if posts %} {% if posts %}
@ -25,7 +31,7 @@
<p class="title is-4"> <p class="title is-4">
<a href="{{ url_for('post.read', id=post.id) }}">{{ post.title }}</a> <a href="{{ url_for('post.read', id=post.id) }}">{{ post.title }}</a>
</p> </p>
<p class="subtitle is-6"><a href="/?submitter={{ post.submitter }}">{{ post.submitter }}</a></p> <p class="subtitle is-6"><a href="/?content=feed&submitter={{ post.submitter }}">{{ post.submitter }}</a></p>
</div> </div>
</div> </div>
@ -50,7 +56,7 @@
<nav class="pagination is-centered pb-4" role="navigation" aria-label="pagination"> <nav class="pagination is-centered pb-4" role="navigation" aria-label="pagination">
<ul class="pagination-list"> <ul class="pagination-list">
{% for p in range(1, total_pages + 1) %} {% for p in range(1, total_pages + 1) %}
<a href="{% if request.args.submitter %}/?submitter={{ request.args.submitter }}&{% else %}/?{% endif %}page={{ p }}" class="pagination-link {% if p == page %}current-page-btn{% endif %}">{{ p }}</a> <a href="/?content=feed&{% if request.args.submitter %}submitter={{ request.args.submitter }}&{% endif %}page={{ p }}" class="pagination-link {% if p == page %}current-page-btn{% endif %}">{{ p }}</a>
{% endfor %} {% endfor %}
</ul> </ul>
</nav> </nav>

@ -24,7 +24,7 @@
<a href="{{ url_for('post.approve', id=post.id) }}"><button type="button" name="button">Approve</button></a> <a href="{{ url_for('post.approve', id=post.id) }}"><button type="button" name="button">Approve</button></a>
<a href="{{ url_for('post.delete', id=post.id) }}"><button type="button" name="button">Reject</button></a> <a href="{{ url_for('post.delete', id=post.id) }}"><button type="button" name="button">Reject</button></a>
{% endif %} {% endif %}
<p>Submitted by <i><u><a href="/?submitter={{ post.submitter }}">{{ post.submitter }}</a></u></i> at <i>{{ post.timestamp }}</i></p> <p>Submitted by <i><u><a href="/?content=feed&submitter={{ post.submitter }}">{{ post.submitter }}</a></u></i> at <i>{{ post.timestamp }}</i></p>
<img src="{{ url_for('post.uploaded_file', filename=post.image_name) }}" width=600/ style="border-radius:4px;"> <img src="{{ url_for('post.uploaded_file', filename=post.image_name) }}" width=600/ style="border-radius:4px;">
</div> </div>
</section> </section>

@ -41,26 +41,36 @@ def post_webhook(msg):
except: except:
return False return False
def get_activity(): def get_latest_tipped_posts():
posts = Post.select() key_name = 'latest_tips'
w = Wallet() tipped_posts = rw_cache(key_name, None, 1200)
data = {}
for p in posts:
data[p.timestamp] = {'type': 'post', 'post': p}
for tx in w.incoming_transfers(p.account_index):
if 'timestamp' in tx:
data[tx['timestamp']] = {'type': 'tx', 'post': p}
dates = sorted(data, reverse=True) if not tipped_posts:
new_data = [] new_data = []
for d in dates: w = Wallet()
new_data.append(data[d]['post']) data = {}
for acc in w.accounts():
txes = w.transfers(acc)
if 'in' in txes:
for tx in txes['in']:
p = Post.select().where(
Post.account_index==acc
).first()
if p:
data[tx['timestamp']] = p
return new_data[0:20] dates = sorted(data, reverse=True)
for d in dates:
if not data[d] in new_data:
new_data.append(data[d])
tipped_posts = rw_cache(key_name, new_data, 1200)
return tipped_posts
# Use hacky filesystem cache since i dont feel like shipping redis # Use hacky filesystem cache since i dont feel like shipping redis
def rw_cache(key_name, data=None): def rw_cache(key_name, data=None, diff_seconds=3600):
pickle_file = path.join(config.DATA_FOLDER, f'{key_name}.pkl') pickle_file = path.join(config.DATA_FOLDER, f'{key_name}.pkl')
try: try:
if path.isfile(pickle_file): if path.isfile(pickle_file):
@ -70,7 +80,7 @@ def rw_cache(key_name, data=None):
diff = now - mtime diff = now - mtime
# If pickled data file is less than an hour old, load it and render page # If pickled data file is less than an hour old, load it and render page
# Otherwise, determine balances, build json, store pickled data, and render page # Otherwise, determine balances, build json, store pickled data, and render page
if diff.seconds < 3600: if diff.seconds < diff_seconds:
print(f'unpickling {key_name}') print(f'unpickling {key_name}')
with open(pickle_file, 'rb') as f: with open(pickle_file, 'rb') as f:
pickled_data = pickle.load(f) pickled_data = pickle.load(f)

@ -53,15 +53,8 @@ class Wallet(object):
return self.make_wallet_rpc('query_key', {'key_type': 'mnemonic'})['key'] return self.make_wallet_rpc('query_key', {'key_type': 'mnemonic'})['key']
def accounts(self): def accounts(self):
accounts = []
_accounts = self.make_wallet_rpc('get_accounts') _accounts = self.make_wallet_rpc('get_accounts')
idx = 0 return [i['account_index'] for i in _accounts['subaddress_accounts']]
self.master_address = _accounts['subaddress_accounts'][0]['base_address']
for _acc in _accounts['subaddress_accounts']:
assert idx == _acc['account_index']
accounts.append(_acc['account_index'])
idx += 1
return accounts
def new_account(self, label=None): def new_account(self, label=None):
_account = self.make_wallet_rpc('create_account', {'label': label}) _account = self.make_wallet_rpc('create_account', {'label': label})

Loading…
Cancel
Save