Source code for view._core.main

#! /usr/bin/env python
# -*- coding: UTF8 -*-
# Este arquivo é parte do programa Kwarwp
# Copyright 2010-2018 Carlo Oliveira <carlo@nce.ufrj.br>,
# `Labase <http://labase.selfip.org/>`__; `GPL <http://j.mp/GNU_GPL3>`__.
#
# Kwarwp é um software livre; você pode redistribuí-lo e/ou
# modificá-lo dentro dos termos da Licença Pública Geral GNU como
# publicada pela Fundação do Software Livre (FSF); na versão 2 da
# Licença.
#
# Este programa é distribuído na esperança de que possa ser útil,
# mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO
# a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU
# junto com este programa, se não, veja em <http://www.gnu.org/licenses/>

"""Brython front end client.

.. moduleauthor:: Carlo Oliveira <carlo@nce.ufrj.br>

"""
import json, os
from base64 import encodebytes as ecd

from .supygirls_factory import GUI
from base64 import decodebytes as dcd

CENAS = ["{}".format(chr(a)) for a in range(ord('a'), ord('z') + 1) if chr(a) not in 'aeiouy']
RMENU = "Edit,_edit"
# RMENU = "Edit,_edit:Open,_open"
MENU = [m.split(",") for m in RMENU.split(":")]
EMENU = [["Run", "_run"], ["Save", "_save"]]


[docs]class Main: def __init__(self, br): self.doc, self.ht, self.alert, self.storage = br.document, br.html, br.alert, br.storage self.ajax, self.timer, self.window = br.ajax, br.timer, br.window self.codename = '{}.main.py'.format(br.codename) self.code, self.br = br.code, br # self.menu = dict(_edit=lambda *_: self._edit(), # _save=lambda *_: self._save(), # _open=lambda *_: self._open(), # _run=lambda *_: self._run(), # ) self.menu = dict(_edit=self._edit, _save=self._save, _open=self._open, _run=self._run, ) self.window.__SUPERPYTHON__ = self self.dialog = self.gui = None if "nav_saver" in self.doc: self.doc["nav_saver"].style.opacity = 1 self.doc["nav_saver"].style.margin = "15px" self.doc["nav_saver"].style.transition = "opacity 55s" def _edit(self, *_): self.doc['nav_waiter'].style.visibility = "visible" self.dialog = self.gui.edit() self.dialog.del_err() self.dialog.show() self.start(EMENU) def _create(self, content='', *_): codename = self.codename.split(".") codename = "/".join(codename[1:-1])+".{}".format(codename[-1]) self.__save(codename, content, request_path='__create', action_name='Creating') def _create_log(self, error='', log="__log__.py", action_name='Creating Log'): codename = self.codename.split(".") # print("_create_log", codename, "/".join(codename[1:-2]+[log])) codename = "/".join(codename[1:-2] + [log]) self.__save(codename, error, request_path='__create', action_name=action_name) def __append_log(self, error, log="__log__.py"): codename = self.codename.split(".") # print("__append_log", codename, "/".join(codename[1:-2]+[log])) codename = "/".join(codename[1:-2]+[log]) self.__save(codename, error, lambda *_: self._create_log(error), request_path="__append_log", action_name="Logging")
[docs] def scorer(self, score, log="__score__.py"): codename = self.codename.split(".") codename = "/".join(codename[-4:-2]+[log]) tabs = " " * score.setdefault("_level", 0) # print("scorer", codename, "{}{},\n".format(tabs, score)) self.__save(codename, "{}{},\n".format(tabs, score), lambda *_: self._create_log(log="__score__.py", action_name=''), request_path="__append_log", action_name="")
def __save(self, codename, contents, creator=lambda *_: None, request_path="__save", action_name="Saving", address=None): def change_color(): self.doc['nav_waiter'].style.visibility = "hidden" self.doc["nav_saver"].style.transition = "opacity 15s" self.doc["nav_saver"].style.opacity = 1 self.doc["nav_saver"].html = "" def display(msg, waiter="visible"): self.doc['nav_waiter'].style.visibility = waiter # self.doc["nav_saver"].style.opacity = 1 self.doc["nav_saver"].style.transition = "opacity 15s" self.doc["nav_saver"].style.opacity = 0 self.doc["nav_saver"].html = msg self.timer.set_timeout(change_color, 5000) def on_complete(request): if request.status == 200 or request.status == 0: if "404" in request.text: self.timer.set_timeout(lambda *_: creator(contents), 1000) display("Attempting to create..") if action_name else None else: display(request.text, waiter="hidden") if action_name else None else: display("error " + request.text) display("{}.. {}".format(action_name, codename)) if action_name else None code = ecd(bytearray(contents.encode("UTF8"))).decode("utf-8") # code = ecd(bytearray(HTMLParser().unescape(self.gui.code).encode("UTF8"))).decode("utf-8") jsrc = json.dumps({'codename': codename, 'code': code}) # print(SAVE, jsrc) req = self.ajax.ajax() req.bind('complete', on_complete) req.set_timeout('20000', lambda *_: display("NOT SAVED: TIMEOUT")) address = address if address else "/game/{}".format(request_path) req.open('POST', address, True) req.set_header('content-type', 'application/json') # x-www-form-urlencoded') req.send(jsrc) def _save(self, *_): codename = self.codename.split(".") codename = "/".join(codename[1:-1])+".{}".format(codename[-1]) # print(" self.gui.dialogue:", codename, self.gui.get_code()) self.__save(codename, self.gui.get_code(), self._create)
[docs] def post_id(self, ev, form_id="ident-form", address='_claim/', *_): ev.preventDefault() self.doc["ident-modal"].className = "modal" contents = {el.name: el.value for el in self.doc[form_id].elements if "author" in el.name} # contents = str({el.name: el.value for el in self.doc[form_id].elements if "author" in name}).replace("'", '"') codename = self.codename.split(".") address = "/play/{}/{}/__claim/".format(codename[-4], codename[-3]) #, address) req = self.ajax.ajax() # print("post_id address", address, contents, codename) req.open('POST', address, True) req.bind('complete', lambda *_: None) req.set_header('content-type', 'application/x-www-form-urlencoded') # x-www-form-urlencoded') req.send(contents)
def _open(self, *_): ... def _run(self, *_): dialog = self.gui.dialogue if self.gui.dialogue else self.dialog self.gui.error = self.error dialog.action(lambda *_: self.start() ) # self.gui.executa_acao(self.dialog, lambda *_: self.start())
[docs] def play(self): self.doc["ident-form"].bind('submit', self.post_id) # print("play codename:", self.codename) self.codename = ".".join(self.codename.split(".")[-4:]) self.__play() if "_TEST_" in os.environ else self.timer.set_timeout(self.__play, 15000)
def __play(self, *_): glob = dict(globals()) glob.update(__name__="__main__") code = dcd(str.encode(self.code)) # -XXX- gambiarra para corrigir o brython codelist = list(code) codeclean = bytes( c for b, c, d in zip(codelist+[0, 0], [0]+codelist+[0], [0, 0]+codelist) if (c, d) != (194, 131) != (b, c)) code = codeclean[1:-1].decode('utf-8') # -XXX- fim da gambiarra exec(code, glob)
[docs] def error(self, error): date = self.window.Date().replace( ' GMT', '.{} GMt'.format(self.window.Date.new().getMilliseconds())) self.__append_log( "\n{{'date': '{} -X- SuPyGirls -X-',\n'error': '''{}'''}},".format( date, error)) return error
[docs] def start(self, navigate=MENU): ht = self.ht self.gui = self.gui if self.gui else GUI(code=self.code, codename=self.codename, br=self.br) self.dialog = self.gui.dialogue def do_ddmenu(): ddmenu = ht.DIV(Class="navbar-item has-dropdown is-hoverable") ddmenu_ancora = ht.A("Open", Class="navbar-link") ddmenu <= ddmenu_ancora ddmenu_box = ht.DIV(Class="navbar-dropdown is-boxed") ddmenu <= ddmenu_box dmenus = [(ht.A(name, Class="navbar-item is-tab"), ev) for name, ev in [("main-0", " main_0")]] [ddmenu_box <= item for item, ev in dmenus] return ddmenu def do_menu(menu): menu.html = "" menus = [(ht.A(name, Class="navbar-item is-tab"), ev) for name, ev in navigate] [menu <= item for item, ev in menus] [item.bind("click", self.menu[ev]) for item, ev in menus] menu <= ht.A('Help', Class="navbar-item is-tab", href='/site/help.html') menu <= ht.A('About', Class="navbar-item is-tab", href='/site/about.html') menu <= ht.A('Home', Class="navbar-item is-tab", href='/') # menu <= do_ddmenu() self.doc['nav_waiter'].style.visibility = "hidden" do_menu(self.doc['right_menu'])
#do_menu(self.doc['burg_menu'])
[docs]def main(**kwargs): Main(**kwargs)
if __name__ == '__main__': main(**{}) PZ = ['afghanistan', 'albania', 'algeria', 'andorra', 'angola', 'antigua', 'argentina', 'armenia', 'australia', 'austria', 'azerbaijan', 'bahamas', 'bahrain', 'bangladesh', 'barbados', 'belarus', 'belgium', 'belize', 'benin', 'bhutan', 'bolivia', 'bosnia', 'botswana', 'brazil', 'brunei', 'bulgaria', 'burkina', 'burundi', 'cabo_verde', 'cambodia', 'cameroon', 'canada', 'african_rep', 'chad', 'chile', 'china', 'colombia', 'comoros', 'dr_congo', 'r_congo', 'costa_rica', 'ivoire', 'croatia', 'cuba', 'cyprus', 'czech_rep', 'denmark', 'djibouti', 'dominica', 'dominican_rep', 'ecuador', 'egypt', 'el_salvador', 'eq_guinea', 'eritrea', 'estonia', 'ethiopia', 'fiji', 'finland', 'france', 'gabon', 'gambia', 'georgia', 'germany', 'ghana', 'greece', 'grenada', 'guatemala', 'guinea', 'guinea-bissau', 'guyana', 'haiti', 'honduras', 'hungary', 'iceland', 'india', 'indonesia', 'iran', 'iraq', 'ireland', 'israel', 'italy', 'jamaica', 'japan', 'jordan', 'kazakhstan', 'kenya', 'kiribati', 'kosovo', 'kuwait', 'kyrgyzstan', 'laos', 'latvia', 'lebanon', 'lesotho', 'liberia', 'libya', 'liechtenstein', 'lithuania', 'luxembourg', 'macedonia', 'madagascar', 'malawi', 'malaysia', 'maldives', 'mali', 'malta', 'marshall', 'mauritania', 'mauritius', 'mexico', 'micronesia', 'moldova', 'monaco', 'mongolia', 'montenegro', 'morocco', 'mozambique', 'myanmar', 'namibia', 'nauru', 'nepal', 'netherlands', 'new_zealand', 'nicaragua', 'niger', 'nigeria', 'north_korea', 'norway', 'oman', 'pakistan', 'palau', 'palestine', 'panama', 'papua', 'paraguay', 'peru', 'philippines', 'poland', 'portugal', 'qatar', 'romania', 'russia', 'rwanda', 'st_kitts', 'saint_lucia', 'st_vincent', 'samoa', 'san_marino', 'sao_tome', 'saudi_arabia', 'senegal', 'serbia', 'seychelles', 'sierra_leone', 'singapore', 'slovakia', 'slovenia', 'solomon', 'somalia', 'south_africa', 'south_korea', 'south_sudan', 'spain', 'sri_lanka', 'sudan', 'suriname', 'swaziland', 'sweden', 'switzerland', 'syria', 'taiwan', 'tajikistan', 'tanzania', 'thailand', 'timor-leste', 'togo', 'tonga', 'trinidad', 'tunisia', 'turkey', 'turkmenistan', 'tuvalu', 'uganda', 'ukraine', 'emirates', 'united_kingdom', 'america', 'uruguay', 'uzbekistan', 'vanuatu', 'vatican', 'venezuela', 'vietnam', 'yemen', 'zambia', 'zimbabwe']