From 97ea013f89560d1b19ced6cbc8554df51412762d Mon Sep 17 00:00:00 2001 From: Joyce Date: Sun, 11 Jan 2026 11:34:04 +0900 Subject: [PATCH] Add files via upload --- index.html | 274 ++++++++++++++++++ multiverse_ultimate_empire.sqlite | Bin 0 -> 110592 bytes ...05\353\260\251\342\230\206\343\200\213.py" | 253 ++++++++++++++++ ... \353\252\205\353\240\271\354\226\264.txt" | 8 + 4 files changed, 535 insertions(+) create mode 100644 index.html create mode 100644 multiverse_ultimate_empire.sqlite create mode 100644 "\343\200\212\342\230\206Gemini\354\231\200\342\227\207\353\202\230\354\235\230\342\226\241\353\201\235\355\214\220\354\231\225\342\226\241\353\251\200\355\213\260\353\262\204\354\212\244\342\227\207\354\213\244\354\213\234\352\260\204-\354\261\204\355\214\205\353\260\251\342\230\206\343\200\213.py" create mode 100644 "\354\204\234\353\262\204 \354\213\244\355\226\211 \353\252\205\353\240\271\354\226\264.txt" diff --git a/index.html b/index.html new file mode 100644 index 000000000..e15e66336 --- /dev/null +++ b/index.html @@ -0,0 +1,274 @@ + + + + + + Multiverse Empire Ultimate + + + + + +
+
+
+

+ 大韓 Multiverse Empire +

+
+ +

+ Established 1995 • 건양(建陽) 원년 +

+ +
+
+
+
+
+ 🪙 실시간 비트코인 시세: 50,000,000 + ₩ +
+
+ 👑 Joyce 지배자 자산: 26,676,094,401₩ +
+
+ +
+
+ +
+ + + +
+
+ + + \ No newline at end of file diff --git a/multiverse_ultimate_empire.sqlite b/multiverse_ultimate_empire.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..d400d5ec4e3ca5934c6119b9a6acc40029d58508 GIT binary patch literal 110592 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 0") + conn.commit() + + # 3. 실시간 전송 + socketio.emit('price_update', {'btc': crypto_prices["비트코인"]}, room='main') + + if change > 1.04: + broadcast_news(f"📈 비트코인 폭등! 현재가: {crypto_prices['비트코인']:,}₩") + elif change < 0.96: + broadcast_news(f"📉 비트코인 대폭락! 현재가: {crypto_prices['비트코인']:,}₩") + except Exception as e: + print(f"Engine Error: {e}") + +threading.Thread(target=empire_background_engine, daemon=True).start() + +@app.route('/') +def index(): return render_template('index.html') + +@app.route('/uploads/') +def download(filename): return send_from_directory(app.config['UPLOAD_FOLDER'], filename) + +@app.route('/upload', methods=['POST']) +def upload(): + file = request.files.get('file'); nick = request.form.get('nickname', '익명') + if file: + fname = f"{int(time.time())}_{secure_filename(file.filename)}" + path = os.path.join(app.config['UPLOAD_FOLDER'], fname) + file.save(path) + reward = 10000 + (os.path.getsize(path) // 5) + update_db(nick, "money", reward) + if reward >= 50000: + broadcast_news(f"{nick}님이 귀중한 파일을 공유하여 {reward:,}₩의 거액을 하사받았습니다!") + f_url = f"{request.host_url.rstrip('/')}/uploads/{fname}" + msg = f"📁 [파일 공유] {file.filename}\n🔗 다운로드: {f_url}" + socketio.emit('message', {'nickname': nick, 'msg': msg, 'type': 'chat', 'rank': '시스템', 'reward': f"+{reward:,}₩"}, room='main') + return '', 204 + +@socketio.on('join') +def on_join(d): + join_room('main') + with sqlite3.connect(DB_FILE) as conn: + conn.row_factory = sqlite3.Row + for h in reversed(conn.execute("SELECT * FROM chats ORDER BY id DESC LIMIT 100").fetchall()): + emit('message', {'nickname': h['nickname'], 'msg': h['msg'], 'type': h['type'], 'rank': h['rank']}) + +@socketio.on('send_msg') +def handle_msg(data): + # 1. 기본 데이터 추출 및 유저 정보 로드 + nick, raw = data['nickname'], data['msg'].strip() + if not raw: return + + u = get_user(nick) + + # 2. 메시지 보상 계산 및 DB 업데이트 + if len(raw) > 500: + fname = f"msg_{int(time.time())}.txt" + path = os.path.join(UPLOAD_FOLDER, fname) + with open(path, "w", encoding="utf-8") as f: f.write(raw) + reward = len(raw) * 100 + update_db(nick, "money", reward) + raw = f"📄 대용량 메시지 감지 (파일 변환)\n🔗 다운로드: {request.host_url.rstrip('/')}/uploads/{fname}" + else: + reward = len(raw) * 50 + update_db(nick, "money", reward) + + if reward >= 100000: + broadcast_news(f"현재 {nick}님이 대용량 메시지 전송으로 {reward:,}₩의 막대한 부를 쌓고 있습니다!") + + # [중요] 보상 수령 후 최신 유저 정보와 자산 다시 계산 + u = get_user(nick) + btc_v = int(u['btc_amount'] * crypto_prices['비트코인']) + total = u['money'] + u['bank_money'] + btc_v + + parts = raw.split() + cmd = parts[0] + + # --- 명령어 처리부 --- + + if cmd == "!잔액": + res = f"💰 {nick}님 자산\n💵 현금: {u['money']:,}₩\n🏦 은행: {u['bank_money']:,}₩\n🪙 코인: {btc_v:,}₩\n💳 총액: {total:,}₩" + emit('message', {'msg': res, 'type': 'system', 'total_asset': total}) + + elif cmd == "!랭킹": + with sqlite3.connect(DB_FILE) as conn: + conn.row_factory = sqlite3.Row + users = conn.execute("SELECT * FROM users").fetchall() + rank_list = [] + for row in users: + t = row['money'] + row['bank_money'] + int(row['btc_amount'] * crypto_prices['비트코인']) + rank_list.append({'nick': row['nickname'], 'total': t}) + rank_list.sort(key=lambda x: x['total'], reverse=True) + top_msg = "🏆 [제국 자산 랭킹 TOP 5]\n" + for i, r in enumerate(rank_list[:5], 1): + medal = "🥇" if i==1 else "🥈" if i==2 else "🥉" if i==3 else "🎖️" + top_msg += f"{medal} {i}위: {r['nick']} ({r['total']:,}₩)\n" + socketio.emit('message', {'msg': top_msg, 'type': 'system', 'total_asset': total}, room='main') + + elif cmd == "!저금": + amt = int(parts[1]) if len(parts)>1 else u['money'] + if u['money'] >= amt: + update_db(nick, "money", -amt); update_db(nick, "bank_money", amt) + u = get_user(nick) # 업데이트 후 다시 로드 + total = u['money'] + u['bank_money'] + btc_v + emit('message', {'msg': f"🏦 {amt:,}₩ 저금됨", 'type': 'system', 'total_asset': total}) + + elif cmd == "!출금": + amt = int(parts[1]) if len(parts)>1 else u['bank_money'] + if u['bank_money'] >= amt: + update_db(nick, "bank_money", -amt); update_db(nick, "money", amt) + u = get_user(nick) + total = u['money'] + u['bank_money'] + btc_v + emit('message', {'msg': f"💸 {amt:,}₩ 출금됨", 'type': 'system', 'total_asset': total}) + + elif cmd == "!매수" and len(parts)>2: + amt = int(parts[2]) + if u['money'] >= amt: + btc_add = amt / crypto_prices['비트코인'] + update_db(nick, "money", -amt); update_db(nick, "btc_amount", btc_add) + u = get_user(nick) + total = u['money'] + u['bank_money'] + int(u['btc_amount'] * crypto_prices['비트코인']) + emit('message', {'msg': f"🪙 비트코인 {btc_add:.8f}개 매수완료", 'type': 'system', 'total_asset': total}) + if amt >= 10000000: + broadcast_news(f"시장 요동! {nick}님이 비트코인을 {btc_add:.4f}개 쓸어담으며 '큰 손'으로 등극했습니다!") + + elif cmd == "!가위바위보" and len(parts)>2: + pick, amt = parts[1], int(parts[2]) + if u['money'] >= amt: + bot = random.choice(["가위", "바위", "보"]) + if pick == bot: res = "무승부" + elif (pick=="가위" and bot=="보") or (pick=="바위" and bot=="가위") or (pick=="보" and bot=="바위"): + update_db(nick, "money", amt); res = f"승리! (+{amt:,}₩)" + else: update_db(nick, "money", -amt); res = f"패배... (-{amt:,}₩)" + u = get_user(nick) + total = u['money'] + u['bank_money'] + int(u['btc_amount'] * crypto_prices['비트코인']) + emit('message', {'msg': f"🎮 {pick} vs {bot} -> {res}", 'type': 'system', 'total_asset': total}) + + elif cmd == "!무한뇌절": + if noejul_loops.get(nick): return + noejul_loops[nick] = True + def task(): + while noejul_loops.get(nick): + update_db(nick, "money", 5000) + socketio.emit('message', {'nickname': nick, 'msg': "🌀 뇌절 적립중...", 'type': 'noejul'}, room='main') + if random.random() < 0.1: + broadcast_news(f"{nick}님이 멈추지 않는 '무한 뇌절'로 시장 경제를 뒤흔들고 있습니다!") + time.sleep(2) + threading.Thread(target=task, daemon=True).start() + + elif cmd in ["!뇌절정지", "!뇌절중단"]: noejul_loops[nick] = False + + elif cmd == "!gemini": + prompt = " ".join(parts[1:]) + if not prompt: + emit('message', {'msg': "🤖 질문을 입력해주세요!", 'type': 'system', 'total_asset': total}) + elif client is None: + emit('message', {'msg': "⚠️ Gemini API가 연결되지 않았습니다.", 'type': 'system', 'total_asset': total}) + else: + try: + res = client.models.generate_content(model="gemini-2.0-flash", contents=prompt) + socketio.emit('message', { + 'nickname': '🤖 Gemini AI', + 'msg': res.text, + 'type': 'bot', + 'rank': '황실 책사' + }, room='main') + except Exception as e: + socketio.emit('message', {'msg': f"⚠️ Gemini 오류: {str(e)}", 'type': 'system'}, room='main') + + elif cmd == "!명령어": + emit('message', {'msg': "!잔액, !랭킹, !저금 [금액], !출금 [금액], !가위바위보 [패] [금액], !매수 비트코인 [금액], !무한뇌절, !뇌절중단, !gemini [질문]", 'type': 'system', 'total_asset': total}) + + # 4. 일반 채팅 메시지 처리 (중복 전송 버그 수정됨) + else: + if total >= 200000000: rank = "멀티버스 지배자" + elif total >= 10000000: rank = "초월자" + else: rank = "평민" + + with sqlite3.connect(DB_FILE) as conn: + conn.execute("INSERT INTO chats (nickname, msg, type, rank) VALUES (?, ?, ?, ?)", (nick, raw, 'chat', rank)) + + # [수정] 단 한 번만 전송하며 total_asset을 포함합니다. + socketio.emit('message', { + 'nickname': nick, + 'msg': raw, + 'type': 'chat', + 'rank': rank, + 'reward': f"+{reward:,}₩", + 'total_asset': total + }, room='main') + +if __name__ == '__main__': + socketio.run(app, debug=True, port=PORT, host='0.0.0.0') diff --git "a/\354\204\234\353\262\204 \354\213\244\355\226\211 \353\252\205\353\240\271\354\226\264.txt" "b/\354\204\234\353\262\204 \354\213\244\355\226\211 \353\252\205\353\240\271\354\226\264.txt" new file mode 100644 index 000000000..a737dad92 --- /dev/null +++ "b/\354\204\234\353\262\204 \354\213\244\355\226\211 \353\252\205\353\240\271\354\226\264.txt" @@ -0,0 +1,8 @@ +#1 터미널 명령어 임력 +$env:GEMINI_API_KEY = "AIzaSyCDB6ARcGOL95pAOMP_i4fuipaT9cvzTT0" +python "《☆Gemini와◇나의□끝판왕□멀티버스◇실시간-채팅방☆》.py" +#2 터미널:1 터미널 명령어 임력 후 같은 터미널을 세로 열어서 아래 명령어 임력 +pip install pyngrok +ngrok http 5001 +ngrok config add-authtoken "35B47pe1IB5gbqGzBjrunZ4MDQi_VBqYuHs9KxQujhNrj6xp" +ngrok http 5001 \ No newline at end of file