【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

本文由IPFS原力区收集译制,版权所属原作者

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

欢迎来到“您可以在2小时或更少的时间内构建时态”系列!在我们迁移到web 3的伟大奇迹过程里,这是我们继续使命的一部分,不仅要帮助RTrades平台培养意识和教育,而且还要帮助培育IPFS和分布式web的意识和教育。   竣工: 你会有一个Discord机器人可以:
  • 使用warp上传和pin数据到IPFS
  • 通过IPFS搜索引擎镜头+时间索引数据
  • 通过Lens+Temporal搜索IPFS数据  
Golang库使用:
  • HTTP客户端
  • discordgo
  • RTradeLtd / go-ipfs-api  
在开始之前,你需要:
  • 注册一个不一样的帐户,这样您就可以生成一个令牌供机器人使用。

  • 在我们开发的云计算环境,向dev.temporal注册一个帐户。

本教程的代码位于这里:github.com/RTradeLtd/dpinner

 

现在让我们开始吧! 教程: 为了便于处理配置,dpinner提供了一个简单的配置包,您可以使用它传递配置参数。 第一部分是为机器人启动时设置身份验证。为此,您必须要么通过环境变量提供值,要么通过使用配置文件提供值。

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

然后我们需要使用时态的v2开发环境进行认证,使用thc包:

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

在本例中,GetJWT函数用于检索使用时态进行身份验证时生成的JWT。这是thc包在内部使用的,但也是我们的IPFS HTTP API端点所期望的。 接下来,您需要通过连接来扭曲我们的高速IPFS HTTP API端点来建立一个IPFS HTTP API客户机。完成此操作之后,您需要配置go-ipfs-api,以便自动为JWT提供所有请求。这是使用WithAuthorization函数完成的。

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

接下来是discordgo中的一些样板代码,它允许我们连接到不和的服务器,并处理任何传入的消息。

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

需要注意的一件事是dg.AddHandler(messageCreate)来指定一个函数,在本例中,messageCreate将在接收到新消息时运行。它允许我们:

// This function will be called (due to AddHandler above) every time a new// message is created on any channel that the autenticated bot has access to.func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {// Ignore all messages created by the bot itself// This isn't required in this specific example but it's a good practice.if m.Author.ID == s.State.User.ID {return } // parse the message contents based off string fields args := strings.Fields(m.Content)if len(args) == 0 {return }// ensure the first field is a valid invocation of dpinnerif args[0] != "!dpinner" {return }// If the message is "ping" reply with "Pong!"if args[1] == "ping" {if _, err := s.ChannelMessageSend(m.ChannelID, "Pong!"); err != nil { fmt.Println(err) }return }// If the message is "pong" reply with "Ping!"if args[1] == "pong" {if _, err := s.ChannelMessageSend(m.ChannelID, "Ping!"); err != nil { fmt.Println(err) }return }if args[1] == "upload" { processUpload(s, m.Attachments, m.ChannelID) }if args[1] == "pin" {for i := 2; i < len(args); i++ {if err := shell.Pin(args[i]); err != nil { s.ChannelMessageSend(m.ChannelID, "failed to process pin request(s)")return } } s.ChannelMessageSend(m.ChannelID, "successfully processed pin request(s)") } if args[1] == "help" { msg := &discordgo.MessageEmbed{ Author: &discordgo.MessageEmbedAuthor{ Name: "dpinner help menu", }, Description: `available commands are: upload: upload an attachment to ipfs pin: pin hash(es) with Temporal index: index hash(es) with Lens search: search Lens for ipfs hashes matching your query `, Footer: &discordgo.MessageEmbedFooter{ Text: "dpinner makes use of Lens, Temporal, and Warp. Try Temporal at https://temporal.cloud", }, Fields: []*discordgo.MessageEmbedField{ { Name: "upload", Value: ` when uploading an attachment, use a comment of **!dpinner upload** this will upload all attachments associated with the comment to ipfs `, }, { Name: "pin", Value: ` the command is **!dpinner upload** and takes a list of hashes example: **!dpinner upload hash1 hash2 hash3**`, }, { Name: "index", Value: ` the command is **!dpinner index** and takes a list of hashes example: **!dpinner index hash1 hash2 hash3**`, }, { Name: "search", Value: ` the command is **!dpinner search** and takes a search query example: **!dpinner search blockchain**`, }, }, } s.ChannelMessageSendEmbed(m.ChannelID, msg) }if args[1] == "index" {for i := 2; i < len(args)-1; i++ {if _, err := tc.IndexHash(args[i], args[len(args)-1] == "reindex=true"); err != nil { s.ChannelMessageSend(m.ChannelID, "failed to process lens index request(s)")return } } s.ChannelMessageSend(m.ChannelID, "successfully indexed hashe(s)") } if args[1] == "search" { processLensSearch(s, m.ChannelID, args) }}

processLensSearch

下面的代码调用processLensSearchprocessUpload的其他函数。这是用来执行任何搜索镜头返回最多10个结果。如果返回超过10个结果,我们将随机选择10个。

func processLensSearch(s *discordgo.Session, channelID string, args []string) { searchArgs := args[2:] query := strings.Join(searchArgs, " ") resp, err := tc.SearchLens(query)if err != nil { s.ChannelMessageSend(channelID, "failed to submit search query to lens")return }var ( results []string count int )if len(resp.Response.Results) > 10 { foundResults := make(map[string]bool)for {if count == 10 {break } hash := resp.Response.Results[rand.Intn(len(resp.Response.Results))].Doc.Hashif foundResults[hash] {continue } results = append(results, hash) foundResults[hash] = true count++ } } else {for _, v := range resp.Response.Results { results = append(results, v.Doc.Hash) } } output := strings.Join(results, " ") msg := &discordgo.MessageEmbed{ Author: &discordgo.MessageEmbedAuthor{ Name: "Lens Search Results", }, Description: output, } s.ChannelMessageSendEmbed(channelID, msg)}

processUpload

这用于处理任何作为附件发送的上传,并带有注释!dpinner upload,将数据存储在IPFS上,并将散列返回给用户。

func processUpload(s *discordgo.Session, attachments []*discordgo.MessageAttachment, channelID string) {for _, v := range attachments { fmt.Printf("fetching object %+vn", v) resp, err := http.Get(v.URL)if err != nil { s.ChannelMessageSend(channelID, "failed to process attachments")return }defer resp.Body.Close() hash, err := shell.Add(resp.Body)if err != nil { s.ChannelMessageSend(channelID, "failed to add attachments to ipfs")return } s.ChannelMessageSend(channelID, fmt.Sprintf("the hash of your file is %s", hash)) }}

  恭喜你完成了! 现在你有一个Discord机器人,可以pin和上传到IPFS,以及搜索内容!此外,可使用命令!dpinner help显示一个简单的帮助菜单。   命令示例

!dpinner pin qmnfpcmr8ln6gannefcfptcr2qnf46ebdwlwv2jvfq QmdytmR4wULMd3SLo6ePF4s3WcRHWcpnJZ7bHhoj3QB13v

dpinner upload(对于任何要处理的上传/附件,必须将其用作注释)

!dpinner index QmdytmR4wULMd3SLo6ePF4s3WcRHWcpnJZ7bHhoj3QB13v

!dpinner index QmdytmR4wULMd3SLo6ePF4s3WcRHWcpnJZ7bHhoj3QB13v reindex=true

!dpinner search blockchain

!dpinner search blockchain data

 

我们希望你喜欢这个系列和你的新Discord机器人!我们将感谢任何反馈,并始终在寻找下一个临时构建的请求。如果您有一个很酷的想法或是一些问题,请加入RTrade的在线社区,Twitter或Telegram和网站。也不要忘记在Github上展示对世界的爱! 对于任何新平台,想知道到底是什么时间、无论如何以及为什么我们建造了它,我们希望这解释了事情。   对于非API用户来说,这是一个简单易学的web界面,是市场上最有特色的第三方IPFS服务。 感谢Alexandre Trottier。

【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

【IPFS原力区】

总部位于上海,深耕IPFS社区发展与商业生态建设。

Force系列产品布局IPFS商业应用,贯通视频娱乐、文件共享、浏览器入口、数据加密管理等服务,为企业与个人的使用提供一站式服务。

旗下IPFS原力区是IPFS顶级价值生态社区,聚集了众多技术大咖和IPFS爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,推动IPFS生态的健康发展。

【IPFS官方周报】及周报相关由IPFS原力区译制整理;每周收集IPFS官方周报,更多相关文章详细内容请关注[IPFS相关] 【IPFS相关】创建一个可以上传、Pin和搜索IPFS的Discord机器人

原创文章,作者:IPFSforce,如若转载,请注明出处:http://ipfser.org/2019/05/07/%e3%80%90ipfs%e7%9b%b8%e5%85%b3%e3%80%91%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%af%e4%bb%a5%e4%b8%8a%e4%bc%a0%e3%80%81pin%e5%92%8c%e6%90%9c%e7%b4%a2ipfs%e7%9a%84discord%e6%9c%ba%e5%99%a8%e4%ba%ba/

发表评论

登录后才能评论

联系我们

在线咨询:点击这里给我发消息

邮件:ipfsforce@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code