2
0
mirror of https://github.com/ComradCollective/Comrad synced 2024-11-17 21:25:37 +00:00
Comrad/client/main.py

233 lines
7.4 KiB
Python
Raw Normal View History

2020-08-03 10:25:58 +00:00
from kivy.uix.screenmanager import Screen,ScreenManager
from kivymd.app import MDApp
2020-08-03 15:48:47 +00:00
from kivymd.uix.button import MDFillRoundFlatButton, MDIconButton
from kivymd.uix.toolbar import MDToolbar
from kivymd.uix.screen import MDScreen
2020-08-03 10:25:58 +00:00
from kivy.lang import Builder
2020-08-03 15:48:47 +00:00
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemeManager
from kivy.properties import ObjectProperty,ListProperty
import time,os
2020-08-03 15:48:47 +00:00
from collections import OrderedDict
from functools import partial
from kivy.uix.screenmanager import NoTransition
from kivymd.uix.label import MDLabel
from kivy.uix.widget import Widget
2020-08-03 16:29:03 +00:00
from kivymd.uix.list import OneLineListItem
from kivymd.uix.card import MDCard, MDSeparator
2020-08-06 10:24:09 +00:00
from kivymd.uix.boxlayout import MDBoxLayout
2020-08-03 20:16:30 +00:00
from kivy.uix.gridlayout import GridLayout
from kivy.metrics import dp
from kivy.properties import NumericProperty
2020-08-03 21:20:38 +00:00
from kivymd.uix.list import * #MDList, ILeftBody, IRightBody, ThreeLineAvatarListItem, TwoLineAvatarListItem, BaseListItem, ImageLeftWidget
from kivy.uix.image import Image, AsyncImage
2020-08-06 08:46:51 +00:00
import requests,json
2020-08-06 09:43:13 +00:00
from kivy.storage.jsonstore import JsonStore
from kivy.core.window import Window
2020-08-09 10:32:42 +00:00
from kivy.core.text import LabelBase
2020-08-11 13:01:48 +00:00
import shutil
2020-08-09 10:32:42 +00:00
2020-08-06 09:43:13 +00:00
Window.size = (640, 1136) #(2.65 * 200, 5.45 * 200)
2020-08-06 08:46:51 +00:00
2020-08-03 15:48:47 +00:00
def log(x):
with open('log.txt','a+') as of:
of.write(str(x)+'\n')
2020-08-03 10:25:58 +00:00
2020-08-10 16:37:42 +00:00
2020-08-06 10:24:09 +00:00
class MyLayout(MDBoxLayout):
2020-08-03 15:48:47 +00:00
scr_mngr = ObjectProperty(None)
2020-08-10 20:38:00 +00:00
post_id = ObjectProperty()
2020-08-06 08:46:51 +00:00
2020-08-03 15:48:47 +00:00
def change_screen(self, screen, *args):
self.scr_mngr.current = screen
2020-08-10 20:38:00 +00:00
def view_post(self,post_id):
self.post_id=post_id
self.change_screen('view')
2020-08-03 15:48:47 +00:00
2020-08-03 20:16:30 +00:00
2020-08-06 10:24:09 +00:00
class MyBoxLayout(MDBoxLayout): pass
class MyLabel(MDLabel): pass
2020-08-03 20:16:30 +00:00
2020-08-09 10:32:42 +00:00
2020-08-03 16:29:03 +00:00
2020-08-06 08:46:51 +00:00
2020-08-09 10:32:42 +00:00
#### LOGIN
2020-08-06 08:46:51 +00:00
2020-08-06 12:55:26 +00:00
2020-08-09 10:32:42 +00:00
def get_tor_proxy_session():
session = requests.session()
# Tor uses the 9050 port as the default socks port
session.proxies = {'http': 'socks5://127.0.0.1:9050',
'https': 'socks5://127.0.0.1:9050'}
return session
def get_tor_python_session():
from torpy.http.requests import TorRequests
with TorRequests() as tor_requests:
with tor_requests.get_session() as s:
return s
2020-08-10 20:38:00 +00:00
2020-08-03 10:25:58 +00:00
class MainApp(MDApp):
2020-08-06 10:24:09 +00:00
title = 'Komrade'
2020-08-09 10:32:42 +00:00
#api = 'http://localhost:5555/api'
api = 'http://128.232.229.63:5555/api'
#api = 'http://komrades.net:5555/api'
2020-08-06 09:43:13 +00:00
logged_in=False
2020-08-06 10:24:09 +00:00
store = JsonStore('komrade.json')
2020-08-06 09:43:13 +00:00
login_expiry = 60 * 60 * 24 * 7 # once a week
#login_expiry = 5 # 5 seconds
2020-08-03 10:25:58 +00:00
2020-08-09 10:32:42 +00:00
def get_session(self):
return get_tor_proxy_session()
#return get_tor_python_session()
2020-08-03 10:25:58 +00:00
def build(self):
2020-08-09 10:32:42 +00:00
# bind
2020-08-03 16:29:03 +00:00
global app,root
2020-08-03 15:48:47 +00:00
app = self
2020-08-10 21:16:36 +00:00
self.root = root = Builder.load_file('root.kv')
2020-08-06 12:55:26 +00:00
# edit logo
logo=root.ids.toolbar.ids.label_title
logo.font_name='assets/Strengthen.ttf'
logo.font_size='58dp'
logo.pos_hint={'center_y':0.43}
# icons
icons=root.ids.toolbar.ids.right_actions.children
for icon in icons:
#log(dir(icon))
#icon.icon='android' #user_font_size='200sp'
icon.font_size='58dp'
icon.user_font_size='58dp'
2020-08-10 15:05:36 +00:00
icon.width='58dp'
icon.size_hint=(None,None)
icon.height='58dp'
2020-08-06 13:02:26 +00:00
2020-08-06 09:43:13 +00:00
if not self.is_logged_in():
self.root.change_screen('login')
else:
2020-08-11 13:01:48 +00:00
self.root.post_id=179
2020-08-10 21:16:36 +00:00
self.root.change_screen('view')
2020-08-03 16:29:03 +00:00
return self.root
2020-08-03 10:25:58 +00:00
2020-08-06 09:43:13 +00:00
def is_logged_in(self):
if self.logged_in: return True
if not self.store.exists('user'): return False
if self.store.get('user')['logged_in']:
if time.time() - self.store.get('user')['logged_in_when'] < self.login_expiry:
self.logged_in=True
return True
return False
def do_login(self):
self.logged_in=True
self.store.put('user',logged_in=True,logged_in_when=time.time())
2020-08-06 12:55:26 +00:00
self.root.change_screen('feed')
2020-08-06 09:43:13 +00:00
2020-08-03 10:25:58 +00:00
2020-08-06 08:46:51 +00:00
def login(self,un,pw):
2020-08-09 10:32:42 +00:00
url = self.api+'/login'
2020-08-06 08:46:51 +00:00
2020-08-09 10:32:42 +00:00
with self.get_session() as sess:
#res = requests.post(url, json={'name':un, 'passkey':pw})
res = sess.post(url, json={'name':un, 'passkey':pw})
if res.status_code==200:
self.do_login()
else:
self.root.ids.login_status.text=res.text
2020-08-06 08:46:51 +00:00
def register(self,un,pw):
2020-08-09 10:32:42 +00:00
url = self.api+'/register'
with self.get_session() as sess:
#res = requests.post(url, json={'name':un, 'passkey':pw})
res = sess.post(url, json={'name':un, 'passkey':pw})
if res.status_code==200:
self.do_login()
else:
self.root.ids.login_status.text=res.text
2020-08-06 08:46:51 +00:00
def post(self, content='', img_src=[]):
log('content: '+str(content))
log('img_src: '+str(img_src))
jsond = {'content':str(content)}
# upload?
filename=img_src[0] if img_src and os.path.exists(img_src[0]) else ''
url_upload=self.api+'/upload'
url_post = self.api+'/post'
server_filename=''
2020-08-11 13:01:48 +00:00
with self.get_session() as sess:
if filename:
log(filename)
self.root.ids.add_post_screen.ids.post_status.text='Uploading file'
2020-08-11 13:01:48 +00:00
with sess.post(url_upload,files={'file':open(filename,'rb')}) as r1:
if r1.status_code==200:
rdata1 = r1.json()
server_filename = rdata1.get('filename','')
if server_filename:
self.root.ids.add_post_screen.ids.post_status.text='File uploaded'
# add post
self.root.ids.add_post_screen.ids.post_status.text='Creating post'
jsond={'img_src':server_filename, 'content':content}
2020-08-11 13:01:48 +00:00
with sess.post(url_post, json=jsond) as r2:
log('got back from post: ' + r2.text)
rdata2 = r2.json()
post_id = rdata2.get('post_id',None)
if post_id:
self.root.ids.add_post_screen.ids.post_status.text='Post created'
self.root.view_post(int(post_id))
2020-08-06 08:46:51 +00:00
2020-08-10 21:16:36 +00:00
def get_post(self,post_id):
2020-08-11 13:01:48 +00:00
# get json from cache?
ofn_json = os.path.join('cache','json',str(post_id)+'.json')
if os.path.exists(ofn_json):
with open(ofn_json) as f:
jsond = json.load(f)
else:
with self.get_session() as sess:
with sess.get(self.api+'/post/'+str(post_id)) as r:
jsond = r.json()
# cache it!
with open(ofn_json,'w') as of:
json.dump(jsond, of)
# is there an image?
img_src = jsond.get('img_src','')
if img_src:
# is it cached?
ofn_image = os.path.join('cache','img',img_src)
if not os.path.exists(ofn_image):
# create dir?
ofn_image_dir = os.path.split(ofn_image)[0]
if not os.path.exists(ofn_image_dir): os.makedirs(ofn_image_dir)
log('getting image!')
with self.get_session() as sess:
with sess.get(self.api+'/download/'+img_src,stream=True) as r:
with open(ofn_image,'wb') as of:
shutil.copyfileobj(r.raw, of)
return jsond
2020-08-06 08:46:51 +00:00
2020-08-03 10:25:58 +00:00
if __name__ == '__main__':
App = MainApp()
App.run()