izuemon commited on
Commit
f1d47b6
·
verified ·
1 Parent(s): 08493fc

Update turbowarp-server/qr-converter.py

Browse files
Files changed (1) hide show
  1. turbowarp-server/qr-converter.py +82 -126
turbowarp-server/qr-converter.py CHANGED
@@ -19,38 +19,29 @@ def get_var(name):
19
  try:
20
  value = tw.get_variable(name=name, name_literal=False)
21
 
22
- # デバッグ用に生の値を出力
23
- print(f"[DEBUG] Raw value of '{name}': {value} (type: {type(value).__name__})")
24
-
25
  # Noneの場合は"0"として扱う
26
  if value is None:
27
- print(f"[WARNING] Variable '{name}' is None, treating as '0'")
28
  return "0"
29
 
30
  # 様々な型を文字列に変換
31
  if isinstance(value, (int, float)):
32
- value = str(int(value)) # 浮動小数点の場合は整数に変換してから文字列に
33
- print(f"[GET] Variable '{name}' converted from number to string: '{value}'")
34
  elif not isinstance(value, str):
35
  value = str(value)
36
- print(f"[GET] Variable '{name}' converted from {type(value).__name__} to string: '{value}'")
37
 
38
- # 表示用に切り詰め
39
- display_value = value[:50] + "..." if len(value) > 50 else value
40
- print(f"[GET] Variable '{name}' = '{display_value}'")
41
  return value
42
  except Exception as e:
43
  print(f"[ERROR] Failed to get variable '{name}': {e}")
44
- return "0" # エラー時も"0"を返す
45
 
46
  def set_var(name, value):
47
  try:
48
  tw.set_variable(name=name, value=value, name_literal=False)
49
- print(f"[SET] Variable '{name}' = '{value[:50]}...'" if len(value) > 50 else f"[SET] Variable '{name}' = '{value}'")
50
  return True
51
  except Exception as e:
52
  print(f"[ERROR] Failed to set variable '{name}': {e}")
53
- return None
54
 
55
  # --- n-chars.txt の読み込み ---
56
  print("[INFO] Loading n-chars.txt...")
@@ -58,22 +49,6 @@ with open("turbowarp-server/n-chars.txt", "r", encoding="utf-8") as f:
58
  n_chars = [line.strip() for line in f]
59
  print(f"[INFO] Loaded {len(n_chars)} characters.")
60
 
61
- def encode_prompt(prompt):
62
- """プロンプト文字列を数字列にエンコード(半角スペースは96として特別処理)"""
63
- encoded = ""
64
- for char in prompt:
65
- if char == " ": # 半角スペースを特別に96として処理
66
- encoded += "96"
67
- else:
68
- try:
69
- idx = n_chars.index(char)
70
- encoded += f"{idx:02d}"
71
- except ValueError:
72
- print(f"[WARNING] Character '{char}' not found in n_chars, skipping")
73
- continue
74
- print(f"[ENCODE] Prompt encoded to length {len(encoded)}")
75
- return encoded
76
-
77
  def decode_prompt(encoded_str):
78
  """クラウド変数の数字列を元にプロンプト文字列に復号(96は半角スペースとして処理)"""
79
  chars = []
@@ -88,7 +63,7 @@ def decode_prompt(encoded_str):
88
  print(f"[WARNING] Invalid index {idx} at position {i}")
89
  i += 2
90
  decoded = "".join(chars)
91
- print(f"[DECODE] Encoded prompt -> '{decoded[:50]}...'")
92
  return decoded
93
 
94
  def rgb_to_scratch_number(rgb):
@@ -113,153 +88,134 @@ def generate_image(prompt):
113
  resp = requests.get("https://izuemon-pixart-alpha-pixart-sigma-xl-2-1024-ms.hf.space/gen", params=params)
114
  resp.raise_for_status()
115
  img = Image.open(BytesIO(resp.content))
116
- print(f"[INFO] Image generated: size={img.size}, mode={img.mode}")
117
  return img
118
 
119
  def resize_and_encode(img):
120
  """90x90にリサイズして数字列に変換"""
121
  img = img.resize((90, 90))
122
- print("[INFO] Resized image to 90x90.")
123
  encoded = ""
124
  for y in range(90):
125
  for x in range(90):
126
  encoded += rgb_to_scratch_number(img.getpixel((x, y)))
127
- print(f"[INFO] Image encoded to string of length {len(encoded)}.")
128
  return encoded
129
 
130
  def split_packets(data, max_length=9998):
131
- """10000文字制限に合わせて分割(先頭 '10' 含む)"""
132
  packets = []
133
  idx = 0
134
  while idx < len(data):
135
  chunk = data[idx:idx + max_length]
136
  packets.append(chunk)
137
  idx += max_length
138
- print(f"[INFO] Data split into {len(packets)} packet(s).")
139
  return packets
140
 
 
 
 
 
 
 
 
 
 
 
141
  # --- メインループ ---
142
  print("[INFO] Starting main loop...")
143
- last_processed_id = "" # 最後に処理したIDを記録
144
 
145
- # 初期化時に変数をリセット
146
  set_var("n0", "0")
147
  set_var("n1", "0")
148
- time.sleep(1) # 設定が反映されるのを待つ
149
 
150
  while True:
151
  try:
152
- # 変数を取得
153
- n1 = get_var("n1")
154
  n0 = get_var("n0")
 
155
 
156
- # デバッグ情報
157
- print(f"[DEBUG] n0='{n0}', n1='{n1[:30]}...' if n1 and len(n1)>30 else n1")
158
-
159
- # n0が利用可能かチェック(厳密な比較)
160
- is_n0_free = (n0 == "0")
161
- print(f"[DEBUG] is_n0_free: {is_n0_free}")
162
-
163
- # n1が存在し、長さが3以上で、先頭が"0"(新規リクエスト)
164
  if n1 and len(n1) >= 3 and n1[0] == "0":
165
- user_id = n1[1:3] # ユーザーID(2桁)
166
- request_data = n1 # 完全なリクエストデータ
167
-
168
- print(f"[INFO] Received request from user {user_id}")
169
- print(f"[INFO] Request data length: {len(request_data)}")
170
- print(f"[INFO] Request data preview: {request_data[:50]}...")
171
 
172
- # 同じリクエストを繰り返し処理しないようにチェック
173
  if request_data == last_processed_id:
174
- print("[INFO] Already processed this request, marking as read...")
175
- # 既読マークをつける(先頭を"01"に変更)
176
- marked_as_read = "01" + request_data[2:]
177
- set_var("n1", marked_as_read)
178
- time.sleep(0.1)
179
  continue
180
 
181
- # n0が利用可能チェック
182
- if is_n0_free:
183
- print("[INFO] n0 is free, starting processing...")
184
 
185
- # 処理中フラグをセット
186
  set_var("n0", "1")
187
 
188
- # リクエストを既読にする(先頭を"01"に変更)
189
- marked_as_read = "01" + request_data[2:]
190
- set_var("n1", marked_as_read)
191
 
192
- # プロンプトをデコード(先頭の"0" + ユーザーID(2桁)を除去)
193
  encoded_prompt = request_data[3:]
194
- print(f"[INFO] Encoded prompt length: {len(encoded_prompt)}")
195
  prompt = decode_prompt(encoded_prompt)
196
- print(f"[INFO] Decoded prompt: '{prompt}'")
197
 
198
- # 画像生成
199
- img = generate_image(prompt)
200
- scratch_data = resize_and_encode(img)
201
-
202
- # パケット分割
203
- packets = split_packets(scratch_data)
204
-
205
- # パケット送信
206
- for i, pkt in enumerate(packets):
207
- print(f"[INFO] Sending packet {i+1}/{len(packets)}")
208
- set_var("n1", "10" + pkt)
209
 
210
- if i < len(packets) - 1:
211
- # 次のパケットのACKを待つ
212
- print("[INFO] Waiting for ACK '11'...")
213
- ack_timeout = 0
214
- ack_received = False
215
- while ack_timeout < 50: # 5秒イムアウト
216
- current_n1 = get_var("n1")
217
- if current_n1 == "11":
218
- print("[INFO] Received ACK")
219
- ack_received = True
220
- break
221
- time.sleep(0.3)
222
- ack_timeout += 1
223
 
224
- if not ack_received:
225
- print("[ERROR] ACK timeout")
226
- set_var("n0", "0")
 
227
  break
228
- else:
229
- # 最後のパケットは完了を待つ
230
- print("[INFO] Waiting for completion '99'...")
231
- complete_timeout = 0
232
- complete_received = False
233
- while complete_timeout < 50:
234
- current_n1 = get_var("n1")
235
- if current_n1 == "99":
236
- print("[INFO] Received completion signal")
237
- complete_received = True
238
- break
239
- time.sleep(0.3)
240
- complete_timeout += 1
241
 
242
- if not complete_received:
 
 
 
 
 
 
 
 
 
 
243
  print("[ERROR] Completion timeout")
 
 
 
 
 
 
 
 
244
 
245
- # 完了後リセット
246
- print("[INFO] Transmission complete. Resetting n0.")
247
  set_var("n0", "0")
248
- last_processed_id = request_data # 処理済みとして記録
249
- print(f"[INFO] Set last_processed_id to: {last_processed_id[:50]}...")
250
 
251
  else:
252
- print("[INFO] n0 is busy, waiting...")
253
- else:
254
- # n1が条件を満たさない場合
255
- if n1:
256
- print(f"[DEBUG] n1 does not meet conditions: first char='{n1[0] if n1 else 'None'}', length={len(n1) if n1 else 0}")
257
- else:
258
- print("[DEBUG] n1 is None or empty")
259
-
260
  except Exception as e:
261
- print(f"[ERROR] Exception in main loop: {e}")
262
  import traceback
263
  traceback.print_exc()
264
-
265
- time.sleep(0.5) # 少し長めの待機時間
 
19
  try:
20
  value = tw.get_variable(name=name, name_literal=False)
21
 
 
 
 
22
  # Noneの場合は"0"として扱う
23
  if value is None:
 
24
  return "0"
25
 
26
  # 様々な型を文字列に変換
27
  if isinstance(value, (int, float)):
28
+ value = str(int(value))
 
29
  elif not isinstance(value, str):
30
  value = str(value)
 
31
 
 
 
 
32
  return value
33
  except Exception as e:
34
  print(f"[ERROR] Failed to get variable '{name}': {e}")
35
+ return "0"
36
 
37
  def set_var(name, value):
38
  try:
39
  tw.set_variable(name=name, value=value, name_literal=False)
40
+ print(f"[SET] {name} = {value[:50]}..." if len(value) > 50 else f"[SET] {name} = {value}")
41
  return True
42
  except Exception as e:
43
  print(f"[ERROR] Failed to set variable '{name}': {e}")
44
+ return False
45
 
46
  # --- n-chars.txt の読み込み ---
47
  print("[INFO] Loading n-chars.txt...")
 
49
  n_chars = [line.strip() for line in f]
50
  print(f"[INFO] Loaded {len(n_chars)} characters.")
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  def decode_prompt(encoded_str):
53
  """クラウド変数の数字列を元にプロンプト文字列に復号(96は半角スペースとして処理)"""
54
  chars = []
 
63
  print(f"[WARNING] Invalid index {idx} at position {i}")
64
  i += 2
65
  decoded = "".join(chars)
66
+ print(f"[DECODE] Prompt: '{decoded[:50]}...'")
67
  return decoded
68
 
69
  def rgb_to_scratch_number(rgb):
 
88
  resp = requests.get("https://izuemon-pixart-alpha-pixart-sigma-xl-2-1024-ms.hf.space/gen", params=params)
89
  resp.raise_for_status()
90
  img = Image.open(BytesIO(resp.content))
91
+ print(f"[INFO] Image generated: size={img.size}")
92
  return img
93
 
94
  def resize_and_encode(img):
95
  """90x90にリサイズして数字列に変換"""
96
  img = img.resize((90, 90))
97
+ print("[INFO] Resized to 90x90")
98
  encoded = ""
99
  for y in range(90):
100
  for x in range(90):
101
  encoded += rgb_to_scratch_number(img.getpixel((x, y)))
102
+ print(f"[INFO] Encoded length: {len(encoded)}")
103
  return encoded
104
 
105
  def split_packets(data, max_length=9998):
106
+ """10000文字制限に合わせて分割"""
107
  packets = []
108
  idx = 0
109
  while idx < len(data):
110
  chunk = data[idx:idx + max_length]
111
  packets.append(chunk)
112
  idx += max_length
113
+ print(f"[INFO] Split into {len(packets)} packets")
114
  return packets
115
 
116
+ def wait_for_signal(expected_value, timeout_seconds=5):
117
+ """特定のシグナルを待つ"""
118
+ start_time = time.time()
119
+ while time.time() - start_time < timeout_seconds:
120
+ current = get_var("n1")
121
+ if current == expected_value:
122
+ return True
123
+ time.sleep(0.1)
124
+ return False
125
+
126
  # --- メインループ ---
127
  print("[INFO] Starting main loop...")
128
+ last_processed_id = ""
129
 
130
+ # 初期化
131
  set_var("n0", "0")
132
  set_var("n1", "0")
133
+ set_var("n2", "0") # データ送信用変数追加
134
 
135
  while True:
136
  try:
 
 
137
  n0 = get_var("n0")
138
+ n1 = get_var("n1")
139
 
140
+ # 新規リクエストの確認(n1が"0"で始まり、長さが3以上)
 
 
 
 
 
 
 
141
  if n1 and len(n1) >= 3 and n1[0] == "0":
142
+ request_data = n1
143
+ user_id = n1[1:3]
 
 
 
 
144
 
145
+ # 重複チェック
146
  if request_data == last_processed_id:
147
+ print(f"[INFO] Duplicate request from user {user_id}, marking as read")
148
+ set_var("n1", "01" + request_data[2:])
149
+ time.sleep(0.2)
 
 
150
  continue
151
 
152
+ # n0が空いている確認
153
+ if n0 == "0":
154
+ print(f"[INFO] Processing request from user {user_id}")
155
 
156
+ # 処理中フラグを立てる
157
  set_var("n0", "1")
158
 
159
+ # リクエストを既読にする
160
+ set_var("n1", "01" + request_data[2:])
 
161
 
162
+ # プロンプトをデコード
163
  encoded_prompt = request_data[3:]
 
164
  prompt = decode_prompt(encoded_prompt)
 
165
 
166
+ # 画像生成とエンコード
167
+ try:
168
+ img = generate_image(prompt)
169
+ scratch_data = resize_and_encode(img)
170
+ packets = split_packets(scratch_data)
 
 
 
 
 
 
171
 
172
+ # パケット送信
173
+ success = True
174
+ for i, pkt in enumerate(packets):
175
+ print(f"[INFO] Sending packet {i+1}/{len(packets)}")
176
+
177
+ # n2にデーを送信
178
+ packet_data = f"{i+1:02d}{len(packets):02d}" + pkt
179
+ set_var("n2", packet_data)
 
 
 
 
 
180
 
181
+ # クライアントからのACKを待つ(n1が"11"になるのを待つ)
182
+ if not wait_for_signal("11", timeout_seconds=10):
183
+ print(f"[ERROR] ACK timeout for packet {i+1}")
184
+ success = False
185
  break
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
+ # ACKを受信したらn1をリセット
188
+ set_var("n1", "0")
189
+ print(f"[INFO] ACK received for packet {i+1}")
190
+
191
+ if success:
192
+ # 完了シグナルを待つ
193
+ print("[INFO] Waiting for completion signal...")
194
+ if wait_for_signal("99", timeout_seconds=10):
195
+ print("[INFO] Completion received")
196
+ set_var("n1", "0")
197
+ else:
198
  print("[ERROR] Completion timeout")
199
+
200
+ # 処理完了
201
+ last_processed_id = request_data
202
+
203
+ except Exception as e:
204
+ print(f"[ERROR] Image processing failed: {e}")
205
+ import traceback
206
+ traceback.print_exc()
207
 
208
+ # n0を解放
 
209
  set_var("n0", "0")
210
+ print("[INFO] Processing complete, n0 released")
 
211
 
212
  else:
213
+ print(f"[INFO] n0 is busy, waiting...")
214
+
215
+ time.sleep(0.1)
216
+
 
 
 
 
217
  except Exception as e:
218
+ print(f"[ERROR] Main loop error: {e}")
219
  import traceback
220
  traceback.print_exc()
221
+ time.sleep(1)