onionr/static-data/default-plugins/circles/flowapi.py

110 lines
3.1 KiB
Python
Raw Normal View History

"""Onionr - Private P2P Communication.
2019-04-27 15:43:16 +00:00
2020-03-28 05:16:42 +00:00
This file primarily serves to allow specific fetching of circles board messages
"""
import operator
import os
2020-04-03 09:27:37 +00:00
import ujson as json
from flask import Response, Blueprint
from deadsimplekv import DeadSimpleKV
from utils import identifyhome
"""
2019-04-27 15:43:16 +00:00
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
2019-04-27 15:43:16 +00:00
2020-03-28 05:16:42 +00:00
flask_blueprint = Blueprint('circles', __name__)
2019-04-27 15:43:16 +00:00
with open(
os.path.dirname(
os.path.realpath(__file__)) + '/info.json', 'r') as info_file:
2019-09-06 05:18:25 +00:00
data = info_file.read().strip()
version = json.loads(data)['version']
2019-09-06 05:18:25 +00:00
BOARD_CACHE_FILE = identifyhome.identify_home() + '/board-index.cache.json'
2020-03-28 05:16:42 +00:00
read_only_cache = DeadSimpleKV(
BOARD_CACHE_FILE,
flush_on_exit=False,
refresh_seconds=30)
2020-03-28 05:16:42 +00:00
@flask_blueprint.route('/circles/getpostsbyboard/<board>')
2019-04-27 15:43:16 +00:00
def get_post_by_board(board):
board_cache = DeadSimpleKV(
2020-03-28 05:16:42 +00:00
BOARD_CACHE_FILE,
flush_on_exit=False)
2019-07-29 03:00:38 +00:00
board_cache.refresh()
posts = board_cache.get(board)
if posts is None:
posts = ''
2019-08-26 02:18:09 +00:00
else:
posts = ','.join(posts)
2019-09-06 05:18:25 +00:00
return Response(posts)
2020-03-28 05:16:42 +00:00
@flask_blueprint.route('/circles/getpostsbyboard/<board>/<offset>')
2019-09-06 05:18:25 +00:00
def get_post_by_board_with_offset(board, offset):
offset = int(offset)
OFFSET_COUNT = 10
board_cache = DeadSimpleKV(
2020-03-28 05:16:42 +00:00
BOARD_CACHE_FILE,
flush_on_exit=False)
2019-09-06 05:18:25 +00:00
board_cache.refresh()
posts = board_cache.get(board)
if posts is None:
posts = ''
else:
posts.reverse()
posts = ','.join(posts[offset:offset + OFFSET_COUNT])
return Response(posts)
2020-03-28 05:16:42 +00:00
@flask_blueprint.route('/circles/version')
2019-09-06 05:18:25 +00:00
def get_version():
return Response(version)
@flask_blueprint.route('/circles/removefromcache/<board>/<name>',
methods=['POST'])
def remove_from_cache(board, name):
2020-03-28 05:16:42 +00:00
board_cache = DeadSimpleKV(BOARD_CACHE_FILE,
flush_on_exit=False)
board_cache.refresh()
posts = board_cache.get(board)
try:
posts.remove(name)
except ValueError:
pass
board_cache.put(board, posts)
return Response('success')
2020-03-28 05:16:42 +00:00
@flask_blueprint.route('/circles/getpopular/<count>')
def get_popular(count):
boards = json.loads(read_only_cache.get_raw_json())
for board in boards:
boards[board] = len(boards[board])
top_boards = sorted(boards.items(), key=operator.itemgetter(1), reverse=True)[:int(count)]
only_board_names = []
for b in top_boards:
only_board_names.append(b[0])
return Response(','.join(only_board_names), content_type='text/csv')