New class Broadcast (in Messenger) which deliever (send and receive) the message with their data to the receivers (pages).

main
Balazs Birtalan 2023-11-09 13:57:36 +00:00
parent f257def4d1
commit b8e1a5cb81
21 changed files with 405 additions and 66 deletions

View File

@ -5,7 +5,6 @@
});
function message(label,data) {
/* DON'T PUT ANY WINDOW.SIGHT.CONSOLE function or other one which call the logs because causing infinity loop */
if(label === "logs") {
//alert(data)

View File

@ -1,3 +0,0 @@
<a href="#" id="screate" data-page="other" data-id="other">Create an "Other" sight!</a>
<a href="#" id="screate" data-page="other">Create an "Other" no id sight!</a>

View File

@ -1,15 +0,0 @@
<link rel="stylesheet" type="text/css" href="content/main_text/test.css">
<div id="example">This is a sentence.</div>
<button onclick="h()">JE</button>
<script>
window.sight.console("This appear in the console from the content/main_text. The content files reach the window.sight.")
</script>
<script>
window.sight.console("2")
function h(){
alert("hello2")
}
</script>

View File

@ -1,3 +0,0 @@
#example {
background-color: yellow;
}

View File

@ -22,17 +22,6 @@
getData("name");*/
});
function message(label, data) {
if(label === "price_change") {
sendMessage("changed_now")
return "I update my price - "+label+"; DATA - "+data
}
if(label === "test") {
return "MAIN GOT TEST MESSAGE"+"; DATA - "+data
}
}
</script>
</head>
<body>

21
base.py
View File

@ -3,10 +3,18 @@ import os
import platform
import configparser
from log import Log
print("---- [BOOT] ----")
from core.registration.registrar import Registrar
registrar = Registrar()
registrar.registry().register("log","display")
registrar.registry().register("console","display")
print("---- [END OF BOOT] ----")
log = Log(3)
log.debugOn()
log.debug_level = 3
log.eventOff()
log.eventOn()
from mouseevents import MouseEvents
from pynput import mouse
@ -14,10 +22,16 @@ from sightfactory import SightFactory
from PyQt6.QtWidgets import QApplication
from pynput.mouse import Controller
import subprocess
import time
def getTimeStamp():
return int(time.time())
def init():
global sights, mousectrl, app, data
data = {}
data["started_time"] = int(time.time())
#init the basic values
app = QApplication(sys.argv)
mousectrl = Controller()
@ -66,12 +80,11 @@ def loadConfigTemplate():
def start():
# Creating admin sight
sights.create("sight-admin", "main")
sights.show("sight-admin")
#sights.create("sight-admin", "main")
#sights.show("sight-admin")
# Creating the main Sight
sights.create("main", data["default_template_page"])
sights.show("main")
app.exec()

View File

@ -3,6 +3,8 @@ import random
import base
from base import log
from PyQt6.QtCore import QObject, pyqtSlot
from core.messenger.broadcast import Broadcast
from core.registration.record import *
class CallHandler(QObject):
@ -14,10 +16,11 @@ class CallHandler(QObject):
def console(self, msg):
log.console(msg)
@pyqtSlot(str, result=str)
"""@pyqtSlot(str, result=str)
def test2(self, t):
print(t+"s")
return t + "_return"
"""
@pyqtSlot(result=str)
def getDefaultTemplate(self):
@ -37,11 +40,11 @@ class CallHandler(QObject):
@pyqtSlot(int, int)
def setSize(self, width, height):
self.sight.resize(width,height);
self.sight.resize(width, height);
@pyqtSlot(int,int)
@pyqtSlot(int, int)
def setPosition(self, x, y):
self.sight.move(x,y)
self.sight.move(x, y)
@pyqtSlot(result=str)
def system(self):
@ -56,7 +59,6 @@ class CallHandler(QObject):
self.sight.addChild(new_id)
""" The child remember its parent. When the child is closed the parent will be know about that. """
base.sights.get(new_id).setParent(self.sight.getId())
print("PARENT " + str(base.sights.get(new_id).getParent()))
return new_id;
@pyqtSlot(str, str, bool)
@ -75,7 +77,7 @@ class CallHandler(QObject):
@pyqtSlot()
def activeSight(self):
if base.data["active_sight"] != self.sight.getId():
print("Active - " + self.sight.getId())
log.byCode("CLA1000E", "Active Sight is " + self.sight.getId())
base.data["active_sight"] = self.sight.getId()
@pyqtSlot()
@ -114,8 +116,6 @@ class CallHandler(QObject):
def endmove(self):
base.data["move"] = False
@pyqtSlot()
def resize(self):
new_height = base.mousectrl.position[1] - self.sight.pos().y()
@ -126,7 +126,7 @@ class CallHandler(QObject):
new_width = 250
self.sight.resize(new_width, new_height)
@pyqtSlot(str, str, str)
"""@pyqtSlot(str, str, str)
def message(self, label, sight_id_json, data):
sight_list = json.loads(sight_id_json)
@ -136,7 +136,23 @@ class CallHandler(QObject):
else:
for sight_id in sight_list:
if base.sights.checkKey(sight_id):
base.sights.get(sight_id).browser.page().runJavaScript("message('" + label + "', '"+data+"')", self.ready)
base.sights.get(sight_id).browser.page().runJavaScript("message('" + label + "', '"+data+"')", self.ready)"""
@pyqtSlot(str, str)
def register(self, type, referral_name):
base.registrar.registry().register(type, referral_name)
@pyqtSlot(str, str, str, str)
def dataReceiver(self, h_type, h_referral_data, d_json_data, receiver_array=None):
if receiver_array is None:
receiver_array = []
if h_type == "message":
r = Record(RecordHeader(h_type, h_referral_data, receiver_array), RecordData(d_json_data))
msg = Broadcast()
msg.sendMessage(r)
# base.sights.get("main").browser.page().runJavaScript("receiveData('" + type + "', '" + referral_data + "', '"+json_data+"')", self.ready)
# print("RECEIVEEEE " + base.registrar.receiveData(type, referral_data, json_data))
def ready(self, returnValue):
if returnValue is not None:

View File

@ -0,0 +1,22 @@
import base
class Broadcast:
def __init__(self):
print("MESSENGER")
def sendMessage(self, record):
if base.registrar.checkData(record) is not None:
for sight in base.sights.getSights().values():
if len(record.getHeader().getReceivers()) == 0:
sight.browser.page().runJavaScript("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')", self.ready)
else:
if sight.getPageId() in record.getHeader().getReceivers():
sight.browser.page().runJavaScript(
"receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')", self.ready)
def ready(self, returnValue):
if returnValue is not None:
print(returnValue)

View File

114
core/registration/record.py Normal file
View File

@ -0,0 +1,114 @@
import json
class RecordHeader():
__h_type = ""
__h_referral_name = ""
__h_receiver_list = []
def __init__(self, header_type: str, referral_name: str, receiver_list=None):
if receiver_list is None:
receiver_list = []
self.__h_receiver_list = receiver_list
self.__h_type = header_type
self.__h_referral_name = referral_name
def analyze(self):
if type(self.__h_type) != str:
print("wrong type value")
return False
self.__h_receiver_list = json.loads(self.__h_receiver_list)
return True
def getType(self):
return self.__h_type
def getReferralName(self):
return self.__h_referral_name
def getReceivers(self):
return self.__h_receiver_list
# NO LIST [] just DICT {} any list in the dict will cause error.
def replaceDictCharacters(d):
for key, value in d.items():
if type(value) == dict:
d[key] = replaceDictCharacters(value)
else:
d[key] = str(value).replace('\\', '\\').replace('\'', "")
return d
class RecordData():
__data = ""
__data_json = ""
def __init__(self, user_data):
if user_data is None:
user_data = {}
self.__data = user_data
self.__data_json = ""
def analyze(self):
if type(self.__data) == str:
try:
# CREATING PYTHON DICT
self.__data = json.loads(self.__data)
# CREATING JSON STRING (for sight.js)
except ValueError:
print("wrong data value")
return False
if type(self.__data) == dict:
self.__data_json = json.dumps(replaceDictCharacters(self.__data))
return True
return False
def getData(self):
return self.__data
def getDataJson(self):
return self.__data_json
class Record():
__state = "CREATING"
__r_header = ""
def __init__(self, record_header, record_data):
if record_header.__class__.__name__ != "RecordHeader":
print("ERROR IT IS NOT A RECORD HEADER")
self.__state = "ERROR"
return
if record_data.__class__.__name__ != "RecordData":
print("ERROR IT IS NOT A RECORD DATA")
self.__state = "ERROR"
return
self.__r_header = record_header
self.__r_data = record_data
self.__state = "NEW"
def analyze(self):
if self.__state == "NEW":
if self.__r_header.analyze() is True and self.__r_data.analyze() is True:
self.__state = "ANALYZED"
else:
self.__state = "ANALYZE_FAILED"
def getState(self):
return self.__state
def getHeader(self):
if self.__state == "ANALYZED":
return self.__r_header
return None
def getData(self, json_data=False):
if self.__state == "ANALYZED":
if json_data:
return self.__r_data.getDataJson()
return self.__r_data.getData()
return None

View File

@ -0,0 +1,58 @@
from core.registration.record import *
from core.registration.registry import Registry
class Registrar:
__registry = ""
def __init__(self):
print("Registrar init")
self.__registry = Registry()
def registry(self):
return self.__registry
def checkData(self, record):
record.analyze()
if record.getState() == "ANALYZED":
if self.__registry.exist(record.getHeader().getType(), record.getHeader().getReferralName()):
print(record.getData())
print(record.getData(True))
return record
else:
print("the record not analyzed")
else:
print("The type or referral name wasnt registered yet")
print("Data is not received!")
return None
"""def receiveData(self, type, referral_name, data):
if self.__registry.exist(type, referral_name):
record = Record(RecordHeader(type, referral_name), RecordData(data))
record.analyze()
if record.getState() == "ANALYZED":
print("RECEIVED")
print(record.getData())
print(record.getData(True))
return True
else:
print("the record not analyzed")
else:
print("The type or referral name wasnt registered yet")
print("Data is not received!")
return False
def sendData(self, type, referral_name, data):
if self.__registry.exist(type, referral_name):
record = Record(RecordHeader(type, referral_name), RecordData(data))
record.analyze()
if record.getState() == "ANALYZED":
print("SENT")
print(record.getData())
print(record.getData(True))
return True
else:
print("the record not analyzed")
else:
print("The type or referral name wasnt registered yet")
print("Data is not sent!")
return False"""

View File

@ -0,0 +1,53 @@
from typing import Set, List, Any
from core.registration.types import types
from core.registration.record import RecordHeader
class Registry:
__registry_store = {}
def __init__(self):
self.__registry_store = self.__RegistryStore()
def register(self, type, referral_name, parameters=None, policy=""):
if parameters is None:
parameters = {}
if types.exist(type):
self.__registry_store.add(type, referral_name)
print("["+type+"] - " + referral_name + " registered.")
return True
else:
print("["+type+"] - " + referral_name + " couldn't registered. Missing the type.")
return False
def unregister(self, type, referral_name):
self.__registry_store.remove(type,referral_name)
def exist(self, type, referral_name):
return self.__registry_store.exist(type, referral_name)
class __RegistryStore:
__store = {}
def __init__(self):
print("Registry Store")
def add(self, type, referral_name):
if type not in self.__store:
self.__store[type] = {}
if referral_name not in self.__store[type]:
self.__store[type][referral_name] = {}
self.__store[type][referral_name]["policy"] = ""
self.__store[type][referral_name]["parameters"] = ""
else:
print("This '"+referral_name+"' referral in this '"+type+"' type is already exist!")
def exist(self, type, referral_name):
if type not in self.__store or referral_name not in self.__store[type]:
return False
return True
def remove(self, type, referral_name):
self.__store[type].pop(referral_name)
if len(self.__store[type]) == 0:
self.__store.pop(type)

View File

@ -0,0 +1,13 @@
class Types():
__types = {}
def __init__(self):
self.__types["message"] = []
self.__types["log"] = []
self.__types["console"] = []
def exist(self, type):
return type in self.__types
types = Types()

View File

@ -133,8 +133,25 @@ label = any unique short message (one word)
sight_id_array = a id list of those sight where the message will be sent to
data = it is a javascript dict (this can contains any key and value) which will be sent
*/
function sendMessage(label, sight_id_array = [], data = {}) {
/*function sendMessage(label, sight_id_array = [], data = {}) {
window.sight.message(label, JSON.stringify(sight_id_array), JSON.stringify(data));
}*/
function sendMessage(referral_name, data, to) {
sendData("message", referral_name, data, to)
}
function sendData(type, referral_name, data, receiver_array = []) {
window.sight.dataReceiver(type, referral_name, JSON.stringify(data), JSON.stringify(receiver_array))
}
function receiveData(type, referral_name, data) {
data = JSON.parse(data);
if(type === "message") {
if (recieveMessage !== "undefined") {
recieveMessage(referral_name, data)
}
}
}
function eventMsg(label, where, data) {

24
log.py
View File

@ -80,6 +80,20 @@ class Log():
if len(wheres) == 0:
wheres = self.whereis()
# IT IS FREEZE BY EVENT (runJavascript cant execute lot of request in one time!
if type.upper() != "EVENT":
dict = {}
dict["type"] = type.upper()
dict["event_code"] = str(event_code)
msg = msg.replace('\\', '\\\\')
msg = msg.replace('\'', "")
dict["msg"] = msg
dict["event_state"] = str(event_state)
dict["date"] = str(dnow)
base.sights.sendMessage("logs", ["sight-admin"], dict)
""" LOG FILE WRITING """
if type not in self.debug_modes[0] and type.upper() != "EVENT":
filename = str(dnow.strftime("%d"))+"-"+str(dnow.strftime("%m"))+"-"+str(dnow.year)+".log"
@ -98,6 +112,8 @@ class Log():
f.close()
""" END LOG FILE WRITING """
""" LOG DISPLAY """
if serious_error is False:
if type.upper() == "EVENT" and self.event_on is False:
@ -105,13 +121,7 @@ class Log():
if type not in self.debug_modes[0] and self.debug_level != 3:
if self.debug is True and type not in self.debug_modes[self.debug_level]:
return
dict = {}
dict["type"] = type.upper()
dict["event_code"] = str(event_code)
dict["msg"] = msg.replace('\\', '\\\\')
dict["event_state"] = str(event_state)
dict["date"] = str(dnow)
base.sights.sendMessage("logs", ["sight-admin"], dict)
print("["+type.upper()+"]",event_code, str(msg), wheres, "["+str(dnow)+"]", sep='\t')
""" END LOG DISPLAY """

View File

@ -32,6 +32,8 @@ loge_codes.addEventCode("BLC1001S", "The admin html file content is loaded in th
loge_codes.addEventCode("SF1000E", "The sight is being created.","CREATING")
loge_codes.addEventCode("SF1000W", "The sight is already exist with that ID. It can't be create a new one with that id.s")
loge_codes.addEventCode("SF1001W", "The sight ID is not exist. It can't be shown!")
loge_codes.addEventCode("CLA1000E", "New Active Sight.")
#EVENT BASED
loge_codes.addEventCode("MES1000E", "Mouse dragged the Sight and move to other position.", "MOVING")

26
main.py
View File

@ -1,2 +1,28 @@
from core.registration.record import *
from core.registration.registrar import Registrar
#record = Record(RecordHeader("message", "say_name"),RecordData({"name":"Bala\zs", "details" : {"born" : "budapest"}}))
#record0 = Record(RecordHeader("message", "say_name"),RecordData('{"name":"Balazs2", "details" : [{"born" : "budapest2"}]}'))
"""
print(record.getData())
record.analyze()
print(record.getState())
if record.getState() == "ANALYZED":
print(record.getData())
print(record.getData(True))
"""
"""
registrar = Registrar()
registrar.registry().register("message","say_name")
user_data = '{"name":"Balazs2", "details" : {"born" : "budapest2"}}'
user_data2 = {"name":"Balazs", "details" : {"born" : "budapest"}}
print(registrar.receiveData("message","say_name", user_data))
print(registrar.sendData("message","say_name", user_data2))
"""
import base
base.init()

View File

@ -22,18 +22,40 @@
$(document).ready(function(){
/*addData("name", "Balazs", true);
getData("name");*/
window.sight.register("message","price_change")
window.sight.register("message","updated")
/*dict = {}
dict["account_id"] = 10227;
dict["account_name"] = "Test Bank";
dict["details"] = {};
dict["details"]["phone"] = 123456789
dict["details"]["place"] = "New York"
sendMessage("test",dict, ["other"])*/
});
function message(label, data) {
function recieveMessage(referral_name, data) {
if(referral_name === "price_change")
alert("MAIN got from OTHER (price_change): "+referral_name + " " + data.account_name+ " " + data.amount + " -> 12500")
data.amount = 12500
sendMessage("updated", data , ["other"])
}
/*function recieveMessage(referral_name, data) {
alert(referral_name + " " + data.account_name)
}*/
/*function message(label, data) {
if(label === "price_change") {
sendMessage("changed_now")
//sendMessage("changed_now")
return "I update my price - "+label+"; DATA - "+data
}
if(label === "test") {
return "MAIN GOT TEST MESSAGE"+"; DATA - "+data
}
}
}*/
</script>
</head>

View File

@ -9,23 +9,29 @@
<script>
$(document).ready(function(){
//getData("name", true);
sendMessage("price_change")
//sendMessage("price_change")
dict = {}
dict["account_id"] = 10227;
dict["account_name"] = "Test Bank";
dict["amount"] = 15000;
dict["details"] = {};
dict["details"]["phone"] = 123456789
dict["details"]["place"] = "New York"
sendMessage("test", ["other","main"], dict)
sendMessage("price_change", dict, ["main"])
});
function message(label,data) {
function recieveMessage(referral_name, data) {
if(referral_name === "updated")
alert("OTHER got from MAIN: updated - " + referral_name + " " + data.account_name+ " " + data.amount)
}
/*function message(label,data) {
if(label === "test") {
data_dict = JSON.parse(data)
return "DATA - "+data_dict["account_name"] + " - " + data_dict["details"]["place"]
}
}
}*/
</script>
</head>
<body>

View File

@ -44,6 +44,9 @@ class Sight(QWidget):
def getParent(self):
return self.parent
def getPageId(self):
return self.page
def setParent(self, id):
self.parent = id

View File

@ -33,7 +33,6 @@ class SightFactory():
return None
if len(id) == 0:
id = self.createUniqueId()
self.list[id] = Sight(id, page)
return id
@ -71,7 +70,6 @@ class SightFactory():
if closeChildrenToo:
self.closeChildren(id)
if self.checkKey(id):
self.eventMessage("CLOSING", "sight", id)
if id == "main":
print("Program Exit!")
base.app.exit(0)
@ -87,7 +85,6 @@ class SightFactory():
def sendMessage(self, label, sight_list, data):
data = json.dumps(data)
print(data)
if len(sight_list) == 0:
for sight in self.list.values():
sight.browser.page().runJavaScript("message('" + label + "', '"+str(data)+"')", self.ready)