zhengshi 1 месяц назад
Родитель
Сommit
a5f7ac49e5
6 измененных файлов с 200 добавлено и 25 удалено
  1. 1 1
      app/controllers/shuiguo.js
  2. 2 1
      app/models/game.js
  3. 14 5
      app/servers/connector/handler/entryHandler.js
  4. 10 7
      app/shuiguo/table.js
  5. 12 11
      http/charge.js
  6. 161 0
      robot.py

+ 1 - 1
app/controllers/shuiguo.js

@@ -794,7 +794,7 @@ proto.startGameAsync = P.coroutine(function* (playerId,yazhus) {
         // console.warn("走到这里了????  ");
         //return { code: C.FAILD, msg: C.TABLE_NOT_READY };
     }
-    if (user.diamond < _.sum(yazhus)) {
+    if (Number(user.diamond).toFixed(2) < _.sum(yazhus).toFixed(2)) {
         return { code: C.FAILD, msg: C.GAME_DIAMOND_LOW };
     }
     // let str5 = "shuiguo 222开始游戏 "+playerId;

+ 2 - 1
app/models/game.js

@@ -396,7 +396,8 @@ module.exports = function (app) {
         istelegram: { type: Number, default: 1 },  //排行榜已发奖励的日期(0点时间戳)
         withdrawfee: { type: Number, default: 3 },  //排行榜已发奖励的日期(0点时间戳)
         withdrawlowlimit: { type: Number, default: 10 },  //排行榜已发奖励的日期(0点时间戳)
-        registerUstd:{ type: Number, default: 0 }
+        registerUstd:{ type: Number, default: 0 },
+        coinurl:{ type: String, default:'' }
     }, { collection: 'sgjconfig' });
 
     mdbgoose.model('SGJConfig', SGJConfigSchema);

+ 14 - 5
app/servers/connector/handler/entryHandler.js

@@ -97,9 +97,17 @@ proto.convertSvgToPng = P.coroutine(function* (svgPath, pngPath, scale, cb) {
       }
     });
   });
-proto.downloadSvg = P.coroutine(function* (svgUrl, savePath, cb) {
-
+proto.downloadSvg = P.coroutine(function* (svgUrl, savePath,playerId, cb) {
+    var self = this
     var req = https.get(svgUrl, function(res) {
+        console.warn("res.statusCode:",res.statusCode)
+        console.warn("res.headers:",res.headers)
+        if (res.statusCode === 302 && res.headers.location) {
+            console.log('检测到302重定向,新地址:', res.headers.location);
+            // 递归请求重定向后的地址
+            self.downloadSvg(res.headers.location, destPngPath+playerId+".png",playerId,function(){});
+            return;
+        }
       if (res.statusCode !== 200) {
         return cb(new Error('下载 SVG 失败,状态码:' + res.statusCode));
       }
@@ -123,6 +131,7 @@ proto.downloadSvg = P.coroutine(function* (svgUrl, savePath, cb) {
   });
 var svgUrl = 'https://bargame.ala456.com/gameRes/1.svg'; // 目标 SVG 地址
 var localSvgPath = 'D:\\web\\root80\\image\\1.svg'; // 本地 SVG 路径
+var localPngPath = 'D:\\web\\root80\\image\\'; // 本地 PNG 路径
 var destPngPath = path.join("D:\\web\\root80\\image\\"); // 目标 PNG 路径
 
 
@@ -303,8 +312,8 @@ proto.login = P.coroutine(function* (msg, session, next) {
             }
         }
     }
-    self.downloadSvg(msg.headurl, localSvgPath, function(err) {
-        console.log("96")
+    self.downloadSvg(msg.headurl, localSvgPath, playerId, function(err) {
+        console.warn("96:msg.headurl",msg.headurl)
         if (err) {
             console.error('下载失败:', err.message);
             return;
@@ -664,7 +673,7 @@ proto.login = P.coroutine(function* (msg, session, next) {
                 account: player.account, 
                 userId: String(player.userId), 
                 name: player.name, 
-                headurl:player.headurl,
+                headurl:encodeURIComponent(player.headurl),
                 taskQuan:taskQuan,
                 sex: player.sex,
                 diamond: String(player.diamond),

+ 10 - 7
app/shuiguo/table.js

@@ -1099,7 +1099,7 @@ proto.dairuAsync = cor(function* (playerId,chairId) {
                 }
                 if(ssbkdrdd < 0){
                     //适合比如身上有14w钻石,带入10w之后,被系统扣钻了8w,那这时候数据表的drCount字段就要改了
-                    drCount = Math.floor(user.diamond / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
+                    drCount = user.diamond .toFixed(2);//Math.floor(user.diamond / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
                     sgjUser.drCount = drCount;
                     sgjUser.lastJoinTime = nowTime;   // 玩家上次进入果游戏时间(留存人数)
                     yield sgjUser.saveAsync();
@@ -1107,9 +1107,9 @@ proto.dairuAsync = cor(function* (playerId,chairId) {
                 // console.warn("带入函数111===  drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
                 // console.warn("带入  ??? ",sgjUser.jzjrldzcz,sgjUser.jzjrldzczjlsj);
                 if(ssbkdrdd >= this.logic.nowCell && sgjUser.jrkbcdrs > 0){
-                    let bckddrd = Math.floor(ssbkdrdd / this.logic.nowCell)*this.logic.nowCell;//本次可多带入的
+                    let bckddrd = ssbkdrdd.toFixed(2);//Math.floor(ssbkdrdd / this.logic.nowCell)*this.logic.nowCell;//本次可多带入的
                     console.warn("bckddrd:",bckddrd," drCount:",drCount)
-                    drCount = Number(drCount)+ Number(bckddrd);
+                    drCount = (Number(drCount)+ Number(bckddrd)).toFixed(2);
                     console.warn("bckddrd:",bckddrd," drCount:",drCount)
                     sgjUser.drCount = drCount;
                     sgjUser.jrkbcdrs -= bckddrd;
@@ -1119,7 +1119,7 @@ proto.dairuAsync = cor(function* (playerId,chairId) {
                 }
             }
             else{
-                drCount = Math.floor(user.diamond / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
+                drCount = user.diamond.toFixed(2);//Math.floor(user.diamond / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
                 sgjUser.drCount = drCount;
                 sgjUser.lastJoinTime = nowTime;   // 玩家上次进入果游戏时间(留存人数)
                 yield sgjUser.saveAsync();
@@ -1133,7 +1133,7 @@ proto.dairuAsync = cor(function* (playerId,chairId) {
                 drCount = this.logic.dairuMax;//(钻石)
             }
             else{
-                drCount = Math.floor(this.nowDiamond2 / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
+                drCount = this.nowDiamond2.toFixed(2);//Math.floor(this.nowDiamond2 / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
             }
             // console.warn("带入  到乐乐 ",sgjUser.jzjrldzczjlsj,sgjUser.drTime);
             let jrkbcdrs = this.logic.dairuMax - drCount;
@@ -1150,7 +1150,7 @@ proto.dairuAsync = cor(function* (playerId,chairId) {
             drCount = this.logic.dairuMax;//(钻石)
         }
         else{
-            drCount = Math.floor(this.nowDiamond2 / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
+            drCount = Number(this.nowDiamond2).toFixed(2);//Math.floor(this.nowDiamond2 / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
             jrkbcdrs = this.logic.dairuMax - drCount;
         }
         let jzjrldzcz = yield this.getjzjrldzcz();
@@ -1206,6 +1206,7 @@ proto.dairuAsync = cor(function* (playerId,chairId) {
 proto.startGameAsync = cor(function* (yazhus) {
     let str4 = "table 开始游戏---id:"+this.id +" 当前局 "+ (this.over+1)+"  nowDiamond  "+this.nowDiamond+"  yazhus  "+JSON.stringify(yazhus);
     logger.warn(str4);////cssj
+    console.warn("str4:",str4)
     // 状态设置
     //现在钻石数量   玩家初始钻石数量不得小于0
     let wh = yield this.app.models.WHstate.findByIdReadOnlyAsync('wh', 'stateWH whTip');
@@ -1238,8 +1239,10 @@ proto.startGameAsync = cor(function* (yazhus) {
             return { code: C.FAILD, msg: "押注数值出错了   前端的问题  "+JSON.stringify(yazhus) };
         }
     }
+    console.warn("this.nowDiamond:",this.nowDiamond," _.sum(yazhus):",_.sum(yazhus))
+    console.warn("this.nowDiamond.toFixed:",this.nowDiamond.toFixed(2)," _.sum(yazhus):",_.sum(yazhus).toFixed(2))
     //本次总押注 身上的钱是否够
-    if(this.nowDiamond < _.sum(yazhus)){ //本次总下注
+    if(this.nowDiamond.toFixed(2) < _.sum(yazhus).toFixed(2)){ //本次总下注
         return { code: C.FAILD, msg: C.GAME_DIAMOND_LOW };//玩家钻石不足
     }
     //时间戳 != 每日人数统计时间

+ 12 - 11
http/charge.js

@@ -373,12 +373,12 @@ proto.savePlayer = P.coroutine(function* (userid,address) {
 		.then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
 });
 
-proto.getDepositAddress = P.coroutine(function* (suffix) {
+proto.getDepositAddress = P.coroutine(function* (suffix,coinurl) {
 	return new Promise((resolve, reject) => {
-		const url = 'https://bar-coinpay.ala456.com/api/deposit/address?' + suffix;
+		const url = "https://"+coinurl+'/api/deposit/address?' + suffix;
 
 		https.get(url, (res) => {
-			console.warn("300");
+			console.warn("300 url:",url);
 			res.setEncoding('utf8');
 
 			if (res.statusCode !== 200) {
@@ -445,7 +445,9 @@ proto.payUsdtLoctionAsync = P.coroutine(function* (query, method, res) {
 			response.address = player.address
 			return self.writeOut(response, res);
 		}
-		let parsedData = yield self.getDepositAddress(suffix)
+		let sgjconfigs = yield app.models.SGJConfig.findMongoAsync();
+		var sgjconfig = sgjconfigs[0]
+		let parsedData = yield self.getDepositAddress(suffix,sgjconfig.coinurl)
 		console.log("parsedData:",parsedData)
 		yield  self.savePlayer(userid,parsedData.data.address);
 		response.address = parsedData.data.address
@@ -619,7 +621,7 @@ proto.withdrawstartAsync = P.coroutine(function* (query, method, res){
 		response.message = "param is wrong"
 		return this.writeOut(response, res);
 	}
-	if (amount < sgjconfig.withdrawlowlimit) {
+	if (amount < sgjconfig.withdrawlowlimit || amount <= 0) {
 		response.code = "1"
 		response.message = "withdraw must bigger than " + sgjconfig.withdrawlowlimit
 		return this.writeOut(response, res);
@@ -705,7 +707,7 @@ proto.withdrawstartAsync = P.coroutine(function* (query, method, res){
 		yield diamondrecord.saveAsync()
 		yield player.saveAsync()
 		yield record.saveAsync();
-		var data = yield self.withdrawSubmit(amount-sgjconfig.withdrawfee, targetAddress, userid,timestamp)
+		var data = yield self.withdrawSubmit(amount-sgjconfig.withdrawfee, targetAddress, userid,timestamp,sgjconfig.coinurl)
 		if (!data.success) {
 			beforeusdt = player.diamond
 			afterusdt = (Number(player.diamond) + Number(amount)).toFixed(2)
@@ -724,7 +726,7 @@ proto.withdrawstartAsync = P.coroutine(function* (query, method, res){
 			SGJUserTongji.feeconfigusdt = (Number(SGJUserTongji.feeconfigusdt) -Number(sgjconfig.withdrawfee)).toFixed(2)//下注
 			record.time = Date.now()
 			record.callBackTime = Date.now()
-			record.msg = data.data.message
+			record.msg = data.message
 			record.status = 2
 			yield record.saveAsync();
 			yield player.saveAsync()
@@ -766,7 +768,6 @@ proto.clearAsync = P.coroutine(function* (query, method, res){
 			var players = yield app.models.Player.findMongoAsync()
 			for (var i = 0; i < players.length; i++) {
 				console.warn("685 players:", players[i].userId)
-				yield players[i].saveAsync()
 				yield players[i].removeAsync()
 			}
 		}
@@ -919,7 +920,7 @@ proto.clearAsync = P.coroutine(function* (query, method, res){
 
 })
 
-proto.withdrawSubmit = P.coroutine(function* (amount, targetAddress, userid,timestamp) {
+proto.withdrawSubmit = P.coroutine(function* (amount, targetAddress, userid,timestamp, coinurl) {
 	// https://bar-coinpay.ala456.com/api/withdraw/submit?additionalAudit=false&amount=0.01&chainCode=tron&refOrderId=ORDER20260228001&targetAddress=TD92sxkgUHHadcoSiHY6Bus5fA9rsAYAKZ&timestamp=1772270280000&tokenCode=usdt&userId=123&sign=bfb1d7bf14f5217cac9204b929ca4334
 
 
@@ -933,7 +934,7 @@ proto.withdrawSubmit = P.coroutine(function* (amount, targetAddress, userid,time
 		let postDataStr = '';
 
 		let options = {
-			hostname: 'bar-coinpay.ala456.com',
+			hostname: coinurl,
 			port: '',
 			path: '/api/withdraw/submit?'+suffix,
 			method: 'POST',
@@ -1209,7 +1210,7 @@ proto.withdrawOkAsync = P.coroutine(function* (query, method, res) {
 		let records = yield app.models.UsdtWithdrawRecord.findMongoAsync({ refOrderId: refOrderId });
 		if (records.length > 0) {
 			var record = records[0]
-			if ((record.amount-record.submifee).toFixed(2)  != am.toFixed(2)  ) {
+			if ((record.amount-record.submitfee).toFixed(2)  != am.toFixed(2)  ) {
 				response.code = "1"
 				response.message = "金额不匹配"
 				console.warn("1208")

+ 161 - 0
robot.py

@@ -0,0 +1,161 @@
+# 导入所需的核心模块
+from telegram import Update, ReplyKeyboardMarkup, KeyboardButton, WebAppInfo, InlineKeyboardButton, InlineKeyboardMarkup
+from telegram.ext import (
+    ApplicationBuilder,
+    CommandHandler,
+    ContextTypes,
+    MessageHandler,
+    filters
+)
+
+# ===================== 替换为你的信息 =====================
+# 1. 机器人Token(从BotFather获取)
+BOT_TOKEN = "8533392621:AAELrojtgNYksFxzQ1rupLfIxh9n38TPsMU"
+# 2. 宣传图片URL(支持公网HTTPS链接,如阿里云OSS/腾讯云COS的图片链接)
+#PHOTO_URL = "https://img2.baidu.com/it/u=1185072698,2725202031&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1111"
+PHOTO_URL = "https://thumbnail1.baidupcs.com/thumbnail/2907b31dbnf01967750bafc75df32b0c?fid=2488527323-250528-62810681873948&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-UYPhKyK8ZxUD%2f0gCa9NSwi%2bdGmc%3d&expires=8h&chkbd=0&chkv=0&dp-logid=9009522059578414684&dp-callid=0&time=1770692400&size=c1920_u1080&quality=90&vuk=2488527323&ft=image&autopolicy=1"
+# 3. Mini App访问链接(从BotFather的/myapps中复制)
+MINI_APP_URL = "https://2016client.ala456.com/fruit/client/index.html"
+# 4. 其他链接(替换为你的实际链接)
+OFFICIAL_WEBSITE = "https://2016client.ala456.com/fruit/client/index.html"
+TG_GROUP_LINK = "https://2016client.ala456.com/fruit/client/index.html"
+TWITTER_LINK = "https://2016client.ala456.com/fruit/client/index.html"
+SUPPORT_LINK = "https://t.me/BarGameService"
+# =========================================================
+
+# 定义/start命令的处理函数:用户发送/start时执行
+async def handle_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
+    # 1. 准备欢迎文案(支持MarkdownV2格式,**加粗**、\n换行)
+    welcome_text = """
+@BarGamesPro_Bot
+欢迎来到  Bar Game!
+
+Bar Game 是一款轻松有趣、随时随地畅玩的线上休闲娱乐平台。
+
+🎰  经典怀旧水果机,重温童年欢乐时光
+
+⚖️ 公平随机算法,每一局都公正透明
+
+📱 全机型适配,随时随地想玩就玩
+
+✨ 无需下载 App,无需注册,打开即可立即体验
+
+休闲娱乐就来 Bar Game,轻松、有趣、更安心!
+    """
+
+    # 2. 构建多行自定义键盘(完全匹配你要的样式)
+    # 每行按钮用[]包裹,多个按钮逗号分隔,row()表示换行
+    keyboard_buttons = [
+        # 第一行:打开Mini App的按钮(核心)
+        [KeyboardButton(
+            text="开始使用",  # 按钮显示文字
+            web_app=WebAppInfo(url=MINI_APP_URL)  # 点击打开的Mini App链接
+        )],
+        # 第二行:官网、客服支持
+        [
+            # KeyboardButton(text="官网"),
+            KeyboardButton(text="客服支持"),
+            KeyboardButton(text="邀请有礼")
+        ],
+        # 第三行:官方TG群、官方Twitter
+        [
+            KeyboardButton(text="官方TG群"),
+            KeyboardButton(text="官方Twitter")
+        ]
+        # 第四行:语言切换
+        # [
+        #     KeyboardButton(text="中文"),
+        #     KeyboardButton(text="英文")
+        # ],
+        # 第五行:邀请加入群组
+        
+    ]
+
+    # 3. 配置键盘样式(resize_keyboard=True:适配手机屏幕大小)
+    # reply_markup = ReplyKeyboardMarkup(
+    #     keyboard_buttons,
+    #     resize_keyboard=True,  # 关键:让键盘自适应大小,不挤压界面
+    #     one_time_keyboard=False  # False:键盘一直显示;True:点击后隐藏
+    # )
+
+    inline_keyboard = [
+        [InlineKeyboardButton(text="开始使用", web_app={"url": MINI_APP_URL})],  # Mini App按钮
+        [
+            InlineKeyboardButton(text="客服支持", url=SUPPORT_LINK),
+            InlineKeyboardButton(text="邀请有礼", url=SUPPORT_LINK)
+        ],
+        [
+            InlineKeyboardButton(text="官方TG群", url=TG_GROUP_LINK),
+            InlineKeyboardButton(text="官方Twitter", url=TWITTER_LINK)
+        ]
+    ]
+
+    # 创建行内键盘对象
+    reply_inline_markup = InlineKeyboardMarkup(inline_keyboard)
+    
+    # 发送「文字+行内按钮」(按钮嵌在文字下方,和文字同区域)
+    # await update.message.reply_html(
+    #     text=welcome_text,
+    #     photo=PHOTO_URL,  # 宣传图片链接
+    #     reply_markup=reply_inline_markup,
+    #     disable_web_page_preview=True  # 禁用链接预览,保持样式整洁
+    # )
+
+    # 4. 发送「图片+文案+自定义键盘」给用户
+    await context.bot.send_photo(
+        chat_id=update.effective_chat.id,  # 接收消息的用户ID
+        photo=PHOTO_URL,  # 宣传图片链接
+        caption=welcome_text,  # 图片下方的欢迎文案
+        parse_mode="None",  # 文案支持Markdown加粗/换行
+        reply_markup=reply_inline_markup  # 绑定自定义键盘
+    )
+
+# 定义按钮点击的处理函数(如用户点击“官网”“客服支持”等按钮时响应)
+async def handle_button_click(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
+    user_message = update.message.text  # 获取用户点击的按钮文字
+    chat_id = update.effective_chat.id  # 获取用户ID
+
+    # 根据不同按钮返回对应内容
+    # if user_message == "官网":
+    #     await context.bot.send_message(chat_id=chat_id, text=f"🔗 官网地址:{OFFICIAL_WEBSITE}")
+    # el
+    if user_message == "客服支持":
+        await context.bot.send_message(chat_id=chat_id, text=f"💬 客服支持:{SUPPORT_LINK}")
+    elif user_message == "官方TG群":
+        await context.bot.send_message(chat_id=chat_id, text=f"👥 官方TG群:{TG_GROUP_LINK}")
+    elif user_message == "官方Twitter":
+        await context.bot.send_message(chat_id=chat_id, text=f"🐦 官方Twitter:{TWITTER_LINK}")
+    # elif user_message == "中文":
+    #     await context.bot.send_message(chat_id=chat_id, text="✅ 已切换为中文显示")
+    # elif user_message == "英文":
+    #     await context.bot.send_message(chat_id=chat_id, text="✅ Switched to English display")
+    elif user_message == "邀请有礼":
+        # 生成群组邀请链接(需先将机器人加入目标群组并设为管理员)
+        # 替换为你的群组ID(格式:-100xxxxxxxxx,从@getidsbot获取)
+        group_id = "-1001234567890"
+        try:
+            invite_link = await context.bot.export_chat_invite_link(group_id)
+            await context.bot.send_message(chat_id=chat_id, text=f"📩 群组邀请链接:{invite_link}")
+        except Exception as e:
+            await context.bot.send_message(chat_id=chat_id, text=f"❌ 生成邀请链接失败:请确保机器人已加入群组并拥有管理员权限\n错误信息:{str(e)}")
+
+# 主函数:启动机器人
+def main() -> None:
+    # 1. 创建机器人应用实例
+    application = ApplicationBuilder().token(BOT_TOKEN).build()
+
+    # 2. 注册/start命令处理器:用户发送/start时调用handle_start函数
+    start_handler = CommandHandler("start", handle_start)
+    application.add_handler(start_handler)
+
+    # 3. 注册按钮点击处理器:监听用户的文本消息(按钮点击本质是发送文本)
+    button_handler = MessageHandler(filters.TEXT & ~filters.COMMAND, handle_button_click)
+    application.add_handler(button_handler)
+
+    # 4. 启动机器人(polling:轮询模式,适合新手,无需服务器配置)
+    print("机器人已启动,按Ctrl+C停止...")
+    application.run_polling()
+
+# 程序入口
+if __name__ == "__main__":
+    main()