From 670ae774efb5f0aa47cc11290d60a7f93bcae174 Mon Sep 17 00:00:00 2001 From: Nicole Rappe Date: Sun, 16 Feb 2025 02:45:55 -0700 Subject: [PATCH] Fixed bunches of issues and isolated character stats to individual nodes. --- .../flyff_EXP_current.cpython-312.pyc | Bin 0 -> 4646 bytes .../flyff_FP_current.cpython-312.pyc | Bin 0 -> 4690 bytes .../flyff_FP_total.cpython-312.pyc | Bin 0 -> 4652 bytes .../flyff_HP_current.cpython-312.pyc | Bin 0 -> 4976 bytes .../flyff_HP_total.cpython-312.pyc | Bin 0 -> 4652 bytes .../flyff_MP_current.cpython-312.pyc | Bin 0 -> 4690 bytes .../flyff_MP_total.cpython-312.pyc | Bin 0 -> 4652 bytes ...lyff_character_status_node.cpython-312.pyc | Bin 4382 -> 6232 bytes Nodes/flyff_EXP_current.py | 93 +++++++++++++++ Nodes/flyff_FP_current.py | 93 +++++++++++++++ Nodes/flyff_FP_total.py | 93 +++++++++++++++ Nodes/flyff_HP_current.py | 112 ++++++++++++++++++ Nodes/flyff_HP_total.py | 93 +++++++++++++++ Nodes/flyff_MP_current.py | 93 +++++++++++++++ Nodes/flyff_MP_total.py | 93 +++++++++++++++ Nodes/flyff_character_status_node.py | 70 ++++++++--- debug_processed.png | Bin 2920 -> 2585 bytes debug_screenshot.png | Bin 14100 -> 12521 bytes 18 files changed, 726 insertions(+), 14 deletions(-) create mode 100644 Nodes/__pycache__/flyff_EXP_current.cpython-312.pyc create mode 100644 Nodes/__pycache__/flyff_FP_current.cpython-312.pyc create mode 100644 Nodes/__pycache__/flyff_FP_total.cpython-312.pyc create mode 100644 Nodes/__pycache__/flyff_HP_current.cpython-312.pyc create mode 100644 Nodes/__pycache__/flyff_HP_total.cpython-312.pyc create mode 100644 Nodes/__pycache__/flyff_MP_current.cpython-312.pyc create mode 100644 Nodes/__pycache__/flyff_MP_total.cpython-312.pyc create mode 100644 Nodes/flyff_EXP_current.py create mode 100644 Nodes/flyff_FP_current.py create mode 100644 Nodes/flyff_FP_total.py create mode 100644 Nodes/flyff_HP_current.py create mode 100644 Nodes/flyff_HP_total.py create mode 100644 Nodes/flyff_MP_current.py create mode 100644 Nodes/flyff_MP_total.py diff --git a/Nodes/__pycache__/flyff_EXP_current.cpython-312.pyc b/Nodes/__pycache__/flyff_EXP_current.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e418f8d39a5e8c5b29219d378c9a1d930b46014 GIT binary patch literal 4646 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 J3z1fr^ItjxTigHu literal 0 HcmV?d00001 diff --git a/Nodes/__pycache__/flyff_HP_current.cpython-312.pyc b/Nodes/__pycache__/flyff_HP_current.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1b1f3965adfd53c16d48a831cb058ca685d6735 GIT binary patch literal 4976 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 Iwi=)R0ZX>Ru>b%7 literal 0 HcmV?d00001 diff --git a/Nodes/__pycache__/flyff_HP_total.cpython-312.pyc b/Nodes/__pycache__/flyff_HP_total.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3fd74eda661b1cbc18bf572b0391281af6c30b4 GIT binary patch literal 4652 zcma)9U2GFq7QW+|iN}teIFN)8=V$DYAFIU#LLekHOM*i}mztCS1&3-hcqYWbvE4h9 z61xuKq0+i5b_v_9lB%j2sr!%>m6m<$W2joG(!SVW*4`;AA??2KMuA-+x(|EqIAc43 zuJ$^)KXcDH_nv#t`Odk2vD>W(%JiT9eCajBVr%HUCLdbe7l9-<6$0zvHF;$H4 zftV!oJ;%aP=pT*ET?|KMi9ai2B^---to&|%A{L1#ygDQE!xP7OQRQb;H9oj!&)$6p zy}j_;JJ{db+q*{+RgsXNoLA%Xs=~*jk%Z3Wo{0-8S<217FGl8NUQ~FIS5zF1ULp)< z6j|Xzu}BQ_J$v^Zc%AQq|Nes>ej2`ni6mVjACF;`(EGzmJR&9(zCv&~3L;f`LFK2z zazx@I;zc{t;MUG5+i%Tdy9`7Yt?djI{+3m4D zBBvMdP#QNPDl$2#Q1LvAwP|DUbO1WPf-8~{Tn!@E0#{-RGHEmo7xN((WXXjDt0Wd` zvs48&mqrUz&@zcUX3e2r$@qkRA!L;#e{nt0g4GS|^d&>$MyLMBi;ki{ln;{cA$AT{7K%lq za!8dWkH@O9%6weLm?)%if)I{|RYA~dL`f3Jn(zUvUbB*M(U>%gAjZRj6uT1D>V$}> zsQOq`Re3J1YPA9egG>OQDq~PZ+g_xBHDXwZgLA;b8mGvr5EbWSk4a;QrGiu;1i}j9*IvAKZ1BPaj?KbWg^?JR#YkAWK&(i)P&AzJiK72`;|W{`JjtC~?agZ_R1ee2 zG*r*8p$D8jSJSr2WI1n+>wR2>EcQI-%yQ0^vDJ5O_h&d~jyt4(zES&8?TUGIFe8s z#4dA?9&wVdXv6pyO)1kXp!wFaNUOERH;GBnpP|o9WwTDv5_`D^R{yO90YAB^Eyd7x zfl^Eq3Zq3vZ7@hujM`}QjeTGfp^>UUlhQeY);kTlax0lD_QA{oENm?jCs_=+i)@7+ z))c#057lY#rdUJjBJ5$d)%ad+rRr1#WB^TjdCuqoMTP4FjmwxRw~~#Vreyz|F4Iai zm3k*o2U52g9J>&PNJ&oTJi7kn6|_K~M^`AIa92>gv1nF1jqz-k(JQyceJldFy>eHz zDKqTKk>cQln4jC(d5G+b=Bwt!Mtg-a_T#AwB%6Oe+CC!30@!9&!*eo#PIC8@e{|%` z*t`5z{~qMWPoJLPCsk3MS0Ktm#P{)!z6bVW$s%z@ASvSC(GvJ+oDq32@quLL&#z(- zf^A%qp>{X4QkmD1lhb8dkzlpp1rO zjRDA1aTAe6Lr1d_*p1^DAikQ=>?#(c${YYb$#DS8XT+!!k##uN;aanl)X*$IT->i_ zg#>0!R0Vk<Jow-S#<6&VvV(->X6B`RMLim}aJ>I!66l&qQ5 ziwd~}-YA$jn`Vc-hGYl|dK5~wZ9Pcurg;(*B#n|N5;yb`)w>w0XW>)Hy=jxT(l`ab)`U1#sw z#U=kU4%N4wtEWB)+PT#SJx8r`L=*etOn} z96O&N8nmu!&ewHj>pJh%b*D!PHb>s(&f46WPXGGb>qpnGX3n0=oH?KA2%1Cb-+J>?)d8c-RPUT;Q<(YYi%KQceTHt{&t^<^!HPw-%peN zfMwK2e@E>b9iYD(V4)u>MJ13&(k4A#`r$s8NlYW4u%#F{HA^VB6p1o$i9{`Y4kAw} zX)BW&67bmnp7*17`w&{BQ}nA+Nka<6tx_~iF_OuMD++a;huHVZ_>+P+PdUO;=z2c` zi6Hp_YL{Xy;JR~DbYfBrATX=Ps0swuF_*o{UOxxe3vC7FRt0qE(rj1`$>H~9-RS{k z9ZGB-hh%}g9Q2ed*)cVG>eR_o@A5jJ@CHh#@UG#BEAwiMPnrgK52u+o9vGPTo>p7R zEOlv$#*ma=GtY<$q=y&}0TJFqDiU-&RXTRy{e-o;C`jkiYBtNM920@~AaE!o$0?$P zjum(}j9-Be#_n}>PY}j0p}K|&jm^uEn~{&B`Np1XW6#=-dyRY3)qksQTp7wc4`iJO za?XK*dw1UL%esAkb^l@sGQT}}*Z!<)|2@}%rJ4uZn^z969lpPP5WK%(iYhd9<(vAl zO?|ih-yh60_1$lp{Lz9sj!=(j)N&|2^!%9(wRD090_}sQ)(n4iJ&-v%nVCG3Ir~oL z%(+b4`Fv9_+Z6l>d=qG1C^IFU^f&nm1BAM-+=kBo zom+xefLB%e9B`AekwX%xTgv4NBs{4k0_sJgQq<-giOAfPla>6z;DMa7A~%F54;@Hy zhQVQyMtWFGvK738R3r}S)}lu-4_yp5^qg`D?}I6Y=nYm-GyyLRlJ1v+#7lAQ9m4r0 zRGR~Zt!ZU{-r1LhKU?3|On%@*cHqR_>JtF_OXDk(E2Eih?wqZo(A}5z=WM$+W&F4W z#KCh4o>1gj15YTcAk4+2d5EWiW)p<>=EcayObxtBBnXyac++E;wFFN3M}@%fTci3j z29u|qZqAq}q}exKMj<&85d;r~o8hZM;P6OMZGvn11I|GvI-q*~Au2Q+ycQ@p+}Dmj zV`^C66TXXeKbfE`>=gCy#wymQZ&>Gohq_sS_gqL2iU&_5;9jV->XWd~F)YSs-c~U= zYMtSasK~5`Xzq=omWT04m?yhZh;xGxQ`C=)nPQ%9LzL|YRQm&R{2lSnn71g(x3ust JL|R?We*r{ATk!w@ literal 0 HcmV?d00001 diff --git a/Nodes/__pycache__/flyff_MP_current.cpython-312.pyc b/Nodes/__pycache__/flyff_MP_current.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7ecc9fb780270bd1ec53761624e1e369208f00b GIT binary patch literal 4690 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 HtIPQxYocsT literal 0 HcmV?d00001 diff --git a/Nodes/__pycache__/flyff_MP_total.cpython-312.pyc b/Nodes/__pycache__/flyff_MP_total.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14fdfb4db284ef644f5b43fa30cc603402c4ca9e GIT binary patch literal 4652 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 diff --git a/Nodes/flyff_EXP_current.py b/Nodes/flyff_EXP_current.py new file mode 100644 index 0000000..1ab4591 --- /dev/null +++ b/Nodes/flyff_EXP_current.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Flyff EXP Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "exp" value as a string + - Uses color (48, 116, 143) for its output port + - Displays "exp" in a text field labeled "Value" + - Retrieves the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffEXPCurrentNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_exp_current_node' + NODE_NAME = 'Flyff - EXP' + + def __init__(self): + super(FlyffEXPCurrentNode, self).__init__() + + # 1) Text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Output port also named "value" + self.add_output('value', color=(48, 116, 143)) + + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + self.set_name("Flyff - EXP (API Disconnected)") + + def process_input(self): + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffEXPCurrentNode: HTTP Status Code = {status_code}") + + if status_code == 200: + try: + data = response.json() or {} + except ValueError: + data = {} + + if isinstance(data, list): + data = {} + + self._api_down = False + self.set_name("Flyff - EXP (API Connected)") + + new_value = data.get("exp", "N/A") + print(f"[DEBUG] FlyffEXPCurrentNode: exp = {new_value}") + + new_value_str = str(new_value) + self.set_property('value', new_value_str) + self.transmit_data(new_value_str) + + else: + self._handle_api_error(f"HTTP {status_code} from FlyffEXPCurrentNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffEXPCurrentNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - EXP (API Disconnected)") diff --git a/Nodes/flyff_FP_current.py b/Nodes/flyff_FP_current.py new file mode 100644 index 0000000..5e902c5 --- /dev/null +++ b/Nodes/flyff_FP_current.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Flyff FP Current Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "fp_current" value as a string + - Uses color (36, 116, 32) for its output port + - Displays "fp_current" in a text field labeled "Value" + - Retrieves the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffFPCurrentNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_fp_current_node' + NODE_NAME = 'Flyff - FP Current' + + def __init__(self): + super(FlyffFPCurrentNode, self).__init__() + + # 1) Text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Output port also named "value" + self.add_output('value', color=(36, 116, 32)) + + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + self.set_name("Flyff - FP Current (API Disconnected)") + + def process_input(self): + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffFPCurrentNode: HTTP Status Code = {status_code}") + + if status_code == 200: + try: + data = response.json() or {} + except ValueError: + data = {} + + if isinstance(data, list): + data = {} + + self._api_down = False + self.set_name("Flyff - FP Current (API Connected)") + + new_value = data.get("fp_current", "N/A") + print(f"[DEBUG] FlyffFPCurrentNode: fp_current = {new_value}") + + new_value_str = str(new_value) + self.set_property('value', new_value_str) + self.transmit_data(new_value_str) + + else: + self._handle_api_error(f"HTTP {status_code} from FlyffFPCurrentNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffFPCurrentNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - FP Current (API Disconnected)") diff --git a/Nodes/flyff_FP_total.py b/Nodes/flyff_FP_total.py new file mode 100644 index 0000000..61a0aa5 --- /dev/null +++ b/Nodes/flyff_FP_total.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Flyff FP Total Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "fp_total" value as a string + - Uses color (36, 116, 32) for its output port + - Displays "fp_total" in a text field labeled "Value" + - Retrieves the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffFPTotalNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_fp_total_node' + NODE_NAME = 'Flyff - FP Total' + + def __init__(self): + super(FlyffFPTotalNode, self).__init__() + + # 1) Text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Output port also named "value" + self.add_output('value', color=(36, 116, 32)) + + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + self.set_name("Flyff - FP Total (API Disconnected)") + + def process_input(self): + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffFPTotalNode: HTTP Status Code = {status_code}") + + if status_code == 200: + try: + data = response.json() or {} + except ValueError: + data = {} + + if isinstance(data, list): + data = {} + + self._api_down = False + self.set_name("Flyff - FP Total (API Connected)") + + new_value = data.get("fp_total", "N/A") + print(f"[DEBUG] FlyffFPTotalNode: fp_total = {new_value}") + + new_value_str = str(new_value) + self.set_property('value', new_value_str) + self.transmit_data(new_value_str) + + else: + self._handle_api_error(f"HTTP {status_code} from FlyffFPTotalNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffFPTotalNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - FP Total (API Disconnected)") diff --git a/Nodes/flyff_HP_current.py b/Nodes/flyff_HP_current.py new file mode 100644 index 0000000..5075d4d --- /dev/null +++ b/Nodes/flyff_HP_current.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +""" +Flyff HP Current Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "hp_current" value as a string + - Uses color (126, 36, 57) for its output port + - Displays "hp_current" in a text field labeled "Value" + - Avoids "list indices must be integers" by retrieving the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffHPCurrentNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_hp_current_node' + NODE_NAME = 'Flyff - HP Current' + + def __init__(self): + super(FlyffHPCurrentNode, self).__init__() + + # 1) Add a text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Add an output port also named "value" + self.add_output('value', color=(126, 36, 57)) + + # Start in "disconnected" state + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + # Default node title + self.set_name("Flyff - HP Current (API Disconnected)") + + def process_input(self): + """ + Called periodically by the global timer in borealis.py + """ + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffHPCurrentNode: HTTP Status Code = {status_code}") + + if status_code == 200: + # Attempt to parse JSON + try: + data = response.json() or {} + except ValueError: + data = {} + + # If data is a list, ignore or convert to {} + if isinstance(data, list): + data = {} + + # Mark node as connected + self._api_down = False + self.set_name("Flyff - HP Current (API Connected)") + + # Retrieve hp_current (default "N/A" if missing) + new_value = data.get("hp_current", "N/A") + print(f"[DEBUG] FlyffHPCurrentNode: hp_current = {new_value}") + + # Convert to string + new_value_str = str(new_value) + + # 3) Update the text input property so the user sees it + self.set_property('value', new_value_str) + + # 4) Transmit to downstream nodes + self.transmit_data(new_value_str) + + else: + # Non-200 => disconnected + self._handle_api_error(f"HTTP {status_code} from FlyffHPCurrentNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffHPCurrentNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + """ + Sends 'data' to any connected node via the "value" port. + (Uses self.outputs().get('value') instead of self.output('value')) + """ + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - HP Current (API Disconnected)") diff --git a/Nodes/flyff_HP_total.py b/Nodes/flyff_HP_total.py new file mode 100644 index 0000000..fc01a48 --- /dev/null +++ b/Nodes/flyff_HP_total.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Flyff HP Total Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "hp_total" value as a string + - Uses color (126, 36, 57) for its output port + - Displays "hp_total" in a text field labeled "Value" + - Retrieves the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffHPTotalNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_hp_total_node' + NODE_NAME = 'Flyff - HP Total' + + def __init__(self): + super(FlyffHPTotalNode, self).__init__() + + # 1) Text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Output port also named "value" + self.add_output('value', color=(126, 36, 57)) + + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + self.set_name("Flyff - HP Total (API Disconnected)") + + def process_input(self): + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffHPTotalNode: HTTP Status Code = {status_code}") + + if status_code == 200: + try: + data = response.json() or {} + except ValueError: + data = {} + + if isinstance(data, list): + data = {} + + self._api_down = False + self.set_name("Flyff - HP Total (API Connected)") + + new_value = data.get("hp_total", "N/A") + print(f"[DEBUG] FlyffHPTotalNode: hp_total = {new_value}") + + new_value_str = str(new_value) + self.set_property('value', new_value_str) + self.transmit_data(new_value_str) + + else: + self._handle_api_error(f"HTTP {status_code} from FlyffHPTotalNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffHPTotalNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - HP Total (API Disconnected)") diff --git a/Nodes/flyff_MP_current.py b/Nodes/flyff_MP_current.py new file mode 100644 index 0000000..bf74f05 --- /dev/null +++ b/Nodes/flyff_MP_current.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Flyff MP Current Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "mp_current" value as a string + - Uses color (35, 89, 144) for its output port + - Displays "mp_current" in a text field labeled "Value" + - Retrieves the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffMPCurrentNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_mp_current_node' + NODE_NAME = 'Flyff - MP Current' + + def __init__(self): + super(FlyffMPCurrentNode, self).__init__() + + # 1) Text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Output port also named "value" + self.add_output('value', color=(35, 89, 144)) + + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + self.set_name("Flyff - MP Current (API Disconnected)") + + def process_input(self): + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffMPCurrentNode: HTTP Status Code = {status_code}") + + if status_code == 200: + try: + data = response.json() or {} + except ValueError: + data = {} + + if isinstance(data, list): + data = {} + + self._api_down = False + self.set_name("Flyff - MP Current (API Connected)") + + new_value = data.get("mp_current", "N/A") + print(f"[DEBUG] FlyffMPCurrentNode: mp_current = {new_value}") + + new_value_str = str(new_value) + self.set_property('value', new_value_str) + self.transmit_data(new_value_str) + + else: + self._handle_api_error(f"HTTP {status_code} from FlyffMPCurrentNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffMPCurrentNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - MP Current (API Disconnected)") diff --git a/Nodes/flyff_MP_total.py b/Nodes/flyff_MP_total.py new file mode 100644 index 0000000..1f1cdcd --- /dev/null +++ b/Nodes/flyff_MP_total.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Flyff MP Total Node (Final Combined Version) + - Polls the API at http://127.0.0.1:5000/data + - Outputs only the "mp_total" value as a string + - Uses color (35, 89, 144) for its output port + - Displays "mp_total" in a text field labeled "Value" + - Retrieves the port with self.outputs().get('value') +""" + +import time +import requests +import traceback +from OdenGraphQt import BaseNode + +class FlyffMPTotalNode(BaseNode): + __identifier__ = 'bunny-lab.io.flyff_mp_total_node' + NODE_NAME = 'Flyff - MP Total' + + def __init__(self): + super(FlyffMPTotalNode, self).__init__() + + # 1) Text input property named "value" for UI display + self.add_text_input('value', 'Value', text='N/A') + + # 2) Output port also named "value" + self.add_output('value', color=(35, 89, 144)) + + self._api_down = True + self._last_api_attempt = 0.0 + self._retry_interval = 5.0 + self._last_error_printed = 0.0 + + self.set_name("Flyff - MP Total (API Disconnected)") + + def process_input(self): + current_time = time.time() + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time + + try: + response = requests.get("http://127.0.0.1:5000/data", timeout=1) + status_code = response.status_code + print(f"[DEBUG] FlyffMPTotalNode: HTTP Status Code = {status_code}") + + if status_code == 200: + try: + data = response.json() or {} + except ValueError: + data = {} + + if isinstance(data, list): + data = {} + + self._api_down = False + self.set_name("Flyff - MP Total (API Connected)") + + new_value = data.get("mp_total", "N/A") + print(f"[DEBUG] FlyffMPTotalNode: mp_total = {new_value}") + + new_value_str = str(new_value) + self.set_property('value', new_value_str) + self.transmit_data(new_value_str) + + else: + self._handle_api_error(f"HTTP {status_code} from FlyffMPTotalNode") + self._api_down = True + + except Exception as e: + tb = traceback.format_exc() + self._handle_api_error(f"Exception in FlyffMPTotalNode: {e}\nTraceback:\n{tb}") + self._api_down = True + + def transmit_data(self, data): + output_port = self.outputs().get('value') + if output_port and output_port.connected_ports(): + for connected_port in output_port.connected_ports(): + connected_node = connected_port.node() + if hasattr(connected_node, 'receive_data'): + try: + connected_node.receive_data(data, source_port_name='value') + except Exception as e: + print(f"[ERROR] Error transmitting data to {connected_node}: {e}") + + def _handle_api_error(self, msg): + current_time = time.time() + if (current_time - self._last_error_printed) >= self._retry_interval: + print(f"[ERROR] {msg}") + self._last_error_printed = current_time + + self.set_name("Flyff - MP Total (API Disconnected)") diff --git a/Nodes/flyff_character_status_node.py b/Nodes/flyff_character_status_node.py index 3b7ded2..d48e9dd 100644 --- a/Nodes/flyff_character_status_node.py +++ b/Nodes/flyff_character_status_node.py @@ -5,12 +5,18 @@ Standardized Flyff Character Status Node: - Polls an API for character stats and updates values dynamically. - Uses a global update timer for processing. - Immediately transmits updated values to connected nodes. + - If the API is unreachable, it will wait for 5 seconds before retrying + and log the error only once per retry period. + - Calls self.view.draw_node() after updating the node name, ensuring + the node's bounding box recalculates even when the API is disconnected. + - Port colors adjusted to match earlier styling. """ from OdenGraphQt import BaseNode from Qt import QtCore import requests import traceback +import time class FlyffCharacterStatusNode(BaseNode): __identifier__ = 'bunny-lab.io.flyff_character_status_node' @@ -19,19 +25,41 @@ class FlyffCharacterStatusNode(BaseNode): def __init__(self): super(FlyffCharacterStatusNode, self).__init__() self.values = { - "HP: Current": "N/A", "HP: Total": "N/A", - "MP: Current": "N/A", "MP: Total": "N/A", - "FP: Current": "N/A", "FP: Total": "N/A", - "EXP": "N/A" + "HP: Current": "N/A", + "HP: Total": "N/A", + "MP: Current": "N/A", + "MP: Total": "N/A", + "FP: Current": "N/A", + "FP: Total": "N/A", + "EXP": "N/A" } - for stat in self.values.keys(): - self.add_output(stat) + # Set each output with a custom color: + # (Choose values close to the screenshot for each port.) + self.add_output('HP: Current', color=(126, 36, 57)) + self.add_output('HP: Total', color=(126, 36, 57)) + self.add_output('MP: Current', color=(35, 89, 144)) + self.add_output('MP: Total', color=(35, 89, 144)) + self.add_output('FP: Current', color=(36, 116, 32)) + self.add_output('FP: Total', color=(36, 116, 32)) + self.add_output('EXP', color=(48, 116, 143)) self.set_name("Flyff - Character Status (API Disconnected)") - # Removed self-contained polling timer; global timer now drives updates. + self.view.draw_node() # ensure bounding box updates initially + + # Variables to handle API downtime gracefully: + self._api_down = False + self._last_api_attempt = 0 + self._retry_interval = 5 # seconds to wait before retrying after a failure + self._last_error_printed = 0 def process_input(self): + current_time = time.time() + # If the API is down, only retry after _retry_interval seconds + if self._api_down and (current_time - self._last_api_attempt < self._retry_interval): + return + + self._last_api_attempt = current_time try: response = requests.get("http://127.0.0.1:5000/data", timeout=1) if response.status_code == 200: @@ -39,12 +67,12 @@ class FlyffCharacterStatusNode(BaseNode): if isinstance(data, dict): mapping = { "hp_current": "HP: Current", - "hp_total": "HP: Total", + "hp_total": "HP: Total", "mp_current": "MP: Current", - "mp_total": "MP: Total", + "mp_total": "MP: Total", "fp_current": "FP: Current", - "fp_total": "FP: Total", - "exp": "EXP" + "fp_total": "FP: Total", + "exp": "EXP" } updated = False for key, value in data.items(): @@ -53,18 +81,32 @@ class FlyffCharacterStatusNode(BaseNode): if str(value) != self.values.get(formatted_key, None): self.values[formatted_key] = str(value) updated = True + self._api_down = False if updated: self.set_name("Flyff - Character Status (API Connected)") + self.view.draw_node() # recalc bounding box on connect self.transmit_data() else: - print("[ERROR] Unexpected API response format (not a dict):", data) + if current_time - self._last_error_printed >= self._retry_interval: + print("[ERROR] Unexpected API response format (not a dict):", data) + self._last_error_printed = current_time self.set_name("Flyff - Character Status (API Disconnected)") + self.view.draw_node() # recalc bounding box on disconnect + self._api_down = True else: - print(f"[ERROR] API request failed with status code {response.status_code}") + if current_time - self._last_error_printed >= self._retry_interval: + print(f"[ERROR] API request failed with status code {response.status_code}") + self._last_error_printed = current_time self.set_name("Flyff - Character Status (API Disconnected)") + self.view.draw_node() + self._api_down = True except Exception as e: + if current_time - self._last_error_printed >= self._retry_interval: + print("[ERROR] Error polling API in CharacterStatusNode:", str(e)) + self._last_error_printed = current_time self.set_name("Flyff - Character Status (API Disconnected)") - print("[ERROR] Error polling API in CharacterStatusNode:", str(e)) + self.view.draw_node() + self._api_down = True def transmit_data(self): for stat, value in self.values.items(): diff --git a/debug_processed.png b/debug_processed.png index 41a544d953e7c0da69aa49ef7468df086e698aa2..5e945f82cbead805952d77f447c1733033ae7cd6 100644 GIT binary patch delta 2414 zcmV-!36b{b7MT=~BP$8uNklP_%-PR5z zmWen!2a_QK8Gjh&pI(4_lC@K!QHagp0+FsY} z4b;?zp5h4I8)@?}v6USu?vv?iTP24TA}z(yN@$WaUyWW%*wDAN*M|G|^aAt|YaW6CvW;L=8+?I}!qq#y?ZluDA?8rQZBl}S@ayaLFZN=`oy4CMhloZE%J^KZ9aN$ID zO!YL@Z+~0PDILYp@=8SWs-^2YiCA*BD%8f3BEN%c4XzI(MbbC#o?Xz z-nr({;Id#Zk;gaPbbs*RM>4@Pm6ArMZb0#xzk?9CgvYq;bomRU7>Y z6c1l&0Zjvkkpt39>4A*Jc`?6JF*93%^woxu;t-!2Ex24AItK3)x7N!^8kk>lojoQ>M3Ell*# z`hU8&?|#h2$dPA6Uh(s3>A64CdC0qcZCDsNG9mlqtI?TRU(TvmauLtPl;#aX!9EWu4&flAz&abIqp@WIyh#%p|voA;U zIW_#D3bAoO>d*ID)A!wi6QYOC*Ca!Hj2Y8>_fj)eBS-$8V;m|@=YRO=F@x{xK=>h( zApXaoPAUVt@%bFVGcmr^1}_v~l~Hb#zbQr`cCfoM@}kFdO>t(ho}I4RLzx}vq& z-OXZ&%(&z zmS?H{1>@y#W}rCaEq&oJ;cXr5!a#92296)Gbj>hMI-a-bjh@=|JRx|!BQ3Nq|Ho+%&wi8~jas!=$BK@$u(Dh6mFb@7 zo*e;`ApoLlWHYdhN9 zzo!>qiQwFOD-F)MP~KjLw&F_T^&RcZ#1A=AcAhSTduLZ}zPO{^S=gE)b5CE+R>A=FMsT_sTOW{eE-(G{Si9W$&!u~Ft=L~Hs@L} z*0V1t*T#QfM;ci84Ih<9bk2WnY|&kpz*lsnf$pWR5O?-+`p52%T6hEK8|LiL2Y(N;z)+>FcR&KE$v7P1I2Mxe+s7^l|ySg(m?s*zntHFcge4kqe(+~eJtuo3+>DQ zb{@pjA0je{8M1qj{mF7`zfK*G-tnG{tce+-sG*R&cs<2zfe)lR+fxeSHf z#&EQC06T=@IQX?kU`e6L^On;$5%uQ=Q@@Pjh^(uPEMGpIcREI`iym9Ij-E?Ud?Ils}K z#_RZy+#kF!a4>RIWf#+Z{D<=GlJxuCjo0zn#5_ih3gK?o>qGz8QT+HbNv~IC#mFJJ zmQG)syjOp8;k!sDKw z*ud7`PD}NLg3Hl$D2|wPeIq1^Xk}&XDrucmMzZ delta 2753 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 y}Cwxk34M!E`g~a2?wNQ2O_Jt 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 literal 14100 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 SIUc+K0000