小试牛刀-Telebot区块链游戏机器人(TS升级)

news2024/11/15 12:02:10

目录

1.编写目的

2.为什么使用TypeScript实现?

3.实现功能

3.1 AI图片生成

3.2 签到

3.3 邀请

3.4 WalletConnect连接

4.功能实现详解

4.1 AI图片生成

4.2 签到

4.3 邀请

4.4 WalletConnect连接

5.功能截图

​6.问题整理


Welcome to Code Block's blog

本篇文章主要介绍了

[Telebot区块链游戏机器人TS升级]
❤博主广交技术好友,喜欢文章的可以关注一下❤

1.编写目的

        本篇文章是小试牛刀-Telebot区块链游戏机器人(python版本)的typescript版本开发记录,实现该版本的主要目的是为了集成walletconnect,以实现用户wallet的无存储公私钥的交互功能.

2.为什么使用TypeScript实现?

        首先walletconnct对TypeScript有着良好的支持,它可以直接使用@walletconnect/sign-client中的组件对wc协议进行配对监听,方便后续的事务签名。而python几乎没有相关的组件库(也可能是我没找到).

        如果没有库,替代方法可以是python直接调用js文件,但这会让整个项目显得不伦不类.或者python去做request请求,请求部署的js文件服务.但这会让项目整体的稳定性变低.

        基于以上的种种考虑,所以这边将整个项目修改为TS版本.

3.实现功能

        实现的功能包括在小试牛刀-Telebot区块链游戏机器人已经实现的所有功能,将其集成到TS版本中.在此基础上,我又增加了以下功能:

3.1 AI图片生成

        用户可以通过输入/genimg+[描述]命令生成一张与描述相关的艺术画作图片.

3.2 签到

        用户可以每天进行签到以获得代币奖励.

3.3 邀请

        用户可以通过/shill命令生成邀请链接,并通过分享该链接在用户通过该链接使用机器人时获得代币奖励.

3.4 WalletConnect连接

      用户可以通过输入/wclink命令,获得walletconnect二维码,当用户通过支持walletconnect协议的钱包扫码时,可以连接到机器人.
        

4.功能实现详解

4.1 AI图片生成

        AI图片生成是通过huggingface上运行的AI模型接口实现(为什么不用国内的?答:少,且要钱).首先你需要在huggingface上注册一个token,当然如果你不想申请也可以直接用代码内的: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,然后使用post请求直接调用相关模型,具体使用方法可以在huggingface官网进行查看.

import TelegramBot from 'node-telegram-bot-api';
import { getCommandsText } from '../filter/Intercept'
import axios from 'axios';
// 定义 API_TOKEN 和数据接口
const API_TOKEN: string = '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'; // 替换为你的 API Token

interface QueryData {
    inputs: string;
}
// 处理分享链接命令
async function handleGenImg(bot:TelegramBot,message: TelegramBot.Message): Promise<void> {
    const inviterUserId = message.from?.id;
    const username = message.from?.username;
    
    const text=getCommandsText(message);

    query({inputs:text})
    .then((response) => {
        const helpText="<b>Beautiful!\nThis is the image you created! @"+{username}+"</b>\n"
        bot.sendPhoto(message.chat.id, response, {
            caption: helpText,
            parse_mode: 'HTML'
        });
    })
    .catch((error) => {
        console.error('Error:', error);
    });
}
// 注册命令处理程序
export function registerGenImgHandlers(bot:TelegramBot): void {
    bot.onText(/\/genimg/, async (msg) => {
        await handleGenImg(bot,msg);
    });
}


async function query(data: any): Promise<any> {
    try {
        const response = await axios.post(
            "https://api-inference.huggingface.co/models/alvdansen/littletinies",
            JSON.stringify(data),
            {
                headers: { Authorization: `Bearer ${API_TOKEN}` },
                responseType: 'arraybuffer'
            },
            
        );
        return response.data;
    } catch (error) {
        console.error('请求错误:', error);
        throw error;
    }
}


4.2 签到

        用户签到即用户每天可点击一次按钮并获得奖励,这里注意用户点击后该用户id要进行记录,防止重复签到,实现代码如下:

async function dailyCheck(bot: TelegramBot, call: TelegramBot.CallbackQuery) {
    const fromUserId = call.from.id;
    const username = call.from.username;
    //防止连续点击
    if (!passGameTime(fromUserId)) {
        bot.sendMessage(call.message!.chat.id, "<b>Please do not send duplicate messages</b>", { parse_mode: 'HTML' });
        bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
        return;
    }

    dailyCommandTime[fromUserId] = Date.now();

    if (await notHasWallet(String(fromUserId))) {
        bot.sendMessage(call.message!.chat.id, `<b>You not have wallet info, you need send [/create] create one game wallet! @${call.from.username}</b>`, { parse_mode: 'HTML' });
        bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
        return;
    }
    //限定签到数量
    if (await checkDailyNumber()) {
        bot.sendMessage(call.message!.chat.id, `<b>There are only 50 people per day, please come again tomorrow! @${call.from.username}</b>`, { parse_mode: 'HTML' });
        bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
        return;
    }

    if (await checkDaily(String(fromUserId))) {
        bot.sendMessage(call.message!.chat.id, `<b>You have already daily check! @${call.from.username}</b>`, { parse_mode: 'HTML' });
        bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
        return;
    }
    //发送奖励
    const [ amount, tx ] = await drawDailyCheck(String(SEND_USER_ID), String(fromUserId));
    if (tx === "error") {
        bot.sendMessage(call.message!.chat.id, "<b>Daily Check Error!</b>", { parse_mode: 'HTML' });
        bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
        return;
    }
    if (tx=="error:account"){
        bot.sendMessage(call.message!.chat.id, `<b>You must first send some BOGGY into the wallet before you can [DaliyCheck] and [invite] @${username}</b>`, { parse_mode: 'HTML' });
        bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
        return;
    }
    //添加每日签到数据
    addDaily(String(fromUserId));

    const markup = {
        inline_keyboard: [
            [
                { text: "Check Tx", url: `https://solscan.io/tx/${tx}` }
            ]
        ]
    };

    bot.sendMessage(call.message!.chat.id, `<b>The Daily Check amount ${amount} BOGGY transfer end, Click 'Check Tx' Button Check @${call.from.username}</b>`, { reply_markup: markup, parse_mode: 'HTML' });
    bot.answerCallbackQuery(call.id, { text: "", show_alert: false });
}

      

4.3 邀请

        邀请实际是通过在机器人链接后拼接命令,格式为:https://t.me/{机器人名}?start={邀请人id},这样当邀请人点击你的链接并使用start命令启动机器人时,则可以获取到链接后的邀请人Id,然后给邀请人发消息并发送代币奖励.实现代码如下:

// 检查是否有邀请码
if (checkCommandsParams(message, "start")) {
    const inviterUserId = getCommandsParams(message);
    const fromUserId = message.from?.id??0;
    //连续点击监测
    if (!passGameTime(fromUserId)) {
        bot.sendMessage(message.chat.id, "<b>Please do not send duplicate messages</b>", { parse_mode: 'HTML' });
        return;
    }

    dailyCommandTime[fromUserId] = Date.now();
    //自己邀请自己检测
    if (Number(inviterUserId) === fromUserId) {
        bot.sendMessage(message.chat.id, "<b>You cannot invite yourself!</b>", { parse_mode: 'HTML' });
        return;
    }
    //游戏钱包检测
    if (await notHasWallet(inviterUserId)) {
        bot.sendMessage(message.chat.id, "<b>The inviter has not created a wallet and cannot receive rewards</b>", { parse_mode: 'HTML' });
        return;
    }
    //已被邀请检测
    if (await hasShildUser(String(fromUserId))) {
        bot.sendMessage(message.chat.id, "<b>Invited users cannot receive rewards</b>", { parse_mode: 'HTML' });
        return;
    }
    //发送奖励
    const [amount, tx ] = await drawDailyCheck(String(SEND_USER_ID), inviterUserId);
    if (tx === "error") {
        bot.sendMessage(message.chat.id, "<b>send rewards Error!</b>", { parse_mode: 'HTML' });
        return;
    }
    if (tx == "error:account"){
        bot.sendMessage(message.chat.id, `<b>You must first send some BOGGY into the wallet before you can [DaliyCheck] and [invite] @${username}</b>`, { parse_mode: 'HTML' });
        return;
    }

    const markup = {
        inline_keyboard: [
            [
                { text: "Check Tx", url: `https://solscan.io/tx/${tx}` }
            ]
        ]
    };

    bot.sendMessage(message.chat.id, `<b>You have accepted the inviter's invitation and the reward ${amount} BOGGY has been sent to the inviter. Click 'Check Tx' Button Check @${message.from?.username}</b>`, { reply_markup: markup, parse_mode: 'HTML' });
    bot.sendMessage(inviterUserId, `<b>The Invited amount ${amount} BOGGY transfer end, Click 'Check Tx' Button Check</b>`, { reply_markup: markup, parse_mode: 'HTML' });
    addShildUser(String(fromUserId), inviterUserId);

4.4 WalletConnect连接

      用户输入/wclink命令后,则调用initWalletConnect进行配对,并发送连接请求,同时通过传入的approval监听用户的连接情况,实现代码如下:

import Client, { SignClient } from "@walletconnect/sign-client";

import TelegramBot from "node-telegram-bot-api";
const metadata={
  name: 'BoggyGame',
  description: 'BoggyGame Bot',
  url: 'https://www.boggycoin.com',
  icons: [
    "https://i.postimg.cc/sftPCk3M/photo-2024-07-12-14-12-43.jpg"
  ]
}
const projectId="申请的ProjectId"
let signClient: Client | null = null;
async function getSignClient() {
  if (!signClient) {
    signClient = await SignClient.init({
      projectId: projectId, // 替换为你的项目ID
      metadata: metadata
    });
  }
  return signClient;
}

export async function initWalletConnect(onApproval: (approval: any,signClient:any,bot:any,message:any) => void,bot:TelegramBot,message:TelegramBot.Message):Promise<String|undefined> {
    const signClient = await getSignClient()

    // 创建会话并发送签名请求
    const {topic} = await signClient.core.pairing.create()
    const { uri,approval } = await signClient.connect({
      pairingTopic: topic,
      requiredNamespaces: {
        solana: {
          methods: [
            "solana_signTransaction",
            "solana_signMessage"
          ],
          chains: [
            "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
          ],
          events: []
        }
      }
    })
    // 调用回调函数处理 approval
    if (approval) {
        onApproval(approval,signClient,bot,message);
    }
    
    return uri;

}

5.功能截图

AI图片生成

签到

邀请

获取链接:

奖励发放:


walletconnect连接

 



6.问题整理

        在集成node-telegram-bot-api组件时,出现网络问题,有时消息不回复,但是python版本运行良好.在Github上找到相关解决方法,给出的解释是要使用ipv4设置或者降低node版本,修改后代码运行良好,方法如下:

const botToken = "123123123:testAAAAA";
const telegramAPI = require("node-telegram-bot-api");
const bot = new telegramAPI(config.botToken, { polling: true, request: {
    agentOptions: {
        keepAlive: true,
        //ipv4
        family: 4
    }
}});
bot.on("message", async function(msg) {
    await bot.sendMessage(msg.chat.id, "test");
});

感谢您的关注和收藏!!!!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

塑造美好心灵,激发创造活力|第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展开展

第三届瓷艺中华“陶溪川杯”儿童青少年陶瓷作品展 展览现场 由中央美术学院、景德镇陶瓷大学、景德镇陶文旅控股集团共同主办&#xff0c;由中国非物质文化遗产保护协会陶瓷分会、中国文化艺术发展促进会陶瓷专业委员会、中央美术学院陶瓷艺术研究院、中央美术学院少儿美术教…

无人机无刷电机技术详解及选型

1. 技术原理 无人机无刷电机&#xff08;Brushless DC Motor, BLDC&#xff09;是现代无人机动力系统的核心部件&#xff0c;其工作原理基于电磁感应和换向技术&#xff0c;实现了无需物理接触即可持续旋转的高效率动力输出。与传统有刷电机相比&#xff0c;无刷电机通过电子换…

你好! Git——如何进行多人协作

多人协作&#xff08;5&#xff09; 一、标签管理二、多人协作2.1 场景一&#xff08;这种方式不常见&#xff09;2.2 场景二&#xff08;常见&#xff09; 一、标签管理 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

【给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?】

给嵌入式新人的几条建议&#xff08;共勉&#xff09;&#xff1a;三-C语言基础怎么补&#xff1f; 前言1、先回答一个问题&#xff0c;对C语言的害怕到底在哪&#xff1f;&#xff08;纠正认知&#xff09;2、C语言基础&#xff0c;要补全部吗&#xff1f;No2.1 先看下自己属于…

深耕编程语言18年,对话 Rust、TypeScript、Nushell 核心贡献者 Sophia Turner | Open AGI Forum

作者 | Annie Xu 采访 | 卢威 责编 | Echo Tang 出品丨GOSIM 开源创新汇 编程语言的种类令人眼花缭乱&#xff0c;但成功的、常用的编程语言却是凤毛麟角。在深耕编程语言研发 18 年的 Sophia June Turner 看来&#xff0c;编程语言成功的关键在于其研发团队的透明度和机制建…

Azure OpenAI Embeddings vs OpenAI Embeddings

题意&#xff1a;Azure OpenAI 嵌入与 OpenAI 嵌入的比较 问题背景&#xff1a; Is anyone getting different results from Azure OpenAI embeddings deployment using text-embedding-ada-002 than the ones from OpenAI? Same text, same model, and the results are cons…

Learning vtkjs之Calculator

过滤器 公式计算器 Calculator 介绍 The Calculator filter is a fast way to add derived data arrays to a dataset. These arrays can be defined over points, cells, or just field data that is “uniform” across the dataset (i.e., constant over all of space). Va…

【小尘送书-第十六期】码农职场:IT人求职就业手册

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

【JVM】垃圾回收机制、算法和垃圾回收器

什么是垃圾回收机制 为了让程序员更加专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以在Java语言中&#xff0c;有了自动的垃圾回收机制&#xff0c;也是我们常常提及的GC(Garbage Collection) 有了这个垃圾回收机制之后&#xff0c;程序员只需…

华为路由常见 LSA 类型的产生及作用域和字段详细解读

华为路由常见 LSA 类型的产生及作用域 类型名称描述1路由器 LSA&#xff08;Router LSA&#xff09;每个设备都会产生&#xff0c;描述了设备的链路状态和开销。该 LSA 只能在接口所属的区域内泛洪2网络 LSA&#xff08;Network LSA&#xff09;由 DR 产生&#xff0c;描述该 …

在cPanelWHM中如何重置 MySQL 用户帐户密码

更改MySQL用户账户密码非常简单。服务器管理员可以在WHM中编辑任何MySQL用户的帐户。cPanel用户可以编辑其帐户管理的数据库的密码。 在WHM中更改MySQL用户帐户密码 打开WHM&#xff0c;在侧边菜单中的SQL服务下选择“Change MySQLUser Password”。Hostease的服务器产品提供稳…

NeRF学习——复现训练中的问题记录

代码复现的框架是基于&#xff1a;pengsida 的 Learning NeRF 希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看&#xff01; 文章目录 1 Windows bug1.1 DataLoader 的多进程 pickle1.2 imageio 输出图片1.3 I/O 2 训练问题2.1 Evaluate 显存爆炸2.2 尝试一2.…

基于VScode和C++实现Protobuf数据格式的通信

目录 1. Protobuf 概述1.1 定义1.2Protobuf的优势 2. Protobuf 语法3、序列号和反序列化3.1 .pb.h 头文件3.2 序列化3.3 反序列化 4、测试用例 Protobuf详细讲解链接 1. Protobuf 概述 1.1 定义 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立…

递归题解集

目录 递归&#xff1a; 一、汉诺塔问题 1.题目链接&#xff1a;面试题 08.06. 汉诺塔问题 2.题目描述&#xff1a; 3.解法&#xff1a;&#xff08;递归&#xff09; &#x1f335;算法思路&#xff1a; &#x1f335;算法流程&#xff1a; &#x1f335;算法代码&…

掌握SEO站外推广优化的五大绝招

对于网站运营者和数字营销人员来说&#xff0c;SEO站外推广是提升网站流量和排名的重要手段。以下是五个有效的SEO站外推广优化方法&#xff0c;希望对大家有所帮助。 1. 高质量的外链建设 高质量的外部链接&#xff08;Backlinks&#xff09;是搜索引擎排名的重要因素之一。…

Openboxes开发环境配置及本地化、API测试

目录 Openboxes简介 开发环境配置及启动 更新中文多语言配置 API测试 Openboxes简介 Openboxes是一款开源的仓库管理软件&#xff0c;提供了库存管理、采购管理、销售管理等功能&#xff0c;可以帮助用户高效地管理仓库及库存。并提供了丰富的API接口。系统基于java8 和Gr…

关于微信,qq小程序的登录,数据库-前端-接口解析

一、背景 当我们在对接微信平台&#xff0c;开发微信小程序时&#xff0c;用户标识是必不可少的。用户标识贯通了整个开发过程&#xff0c;所以获取到唯一的用户标识是必须的。 二、多平台兼容 因为考虑到一次开发&#xff0c;可多端运行&#xff0c;需要考虑兼容多平台兼…

SAP 财务管理系统 —— 企业财务智能化的领航者

在当今数字化时代&#xff0c;企业财务管理的智能化已成为推动企业持续增长的关键因素。SAP 财务管理系统通过智能化技术&#xff0c;帮助财务部门提高收入、控制成本并降低财务风险&#xff0c;释放财务数字化转型的价值。财务 ERP 作为 SAP 的核心组成部分&#xff0c;将帮助…

【机器学习】成本函数在逻辑回归中的形式以及逻辑回归的成本函数

引言 在机器学习中&#xff0c;逻辑回归是一种用于二分类问题的线性回归的扩展。逻辑回归的成本函数是用来评估模型预测结果与实际结果之间差异的函数 文章目录 引言一、成本函数在逻辑回归中的形式1.1 成本函数的具体形式1.1.1 对于单个训练样本 二、逻辑回归的成本函数实现2.…