云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

网站空间_n点虚拟主机管理系统_超低折扣

小七 141 0

Minecraft API与工人+咖啡脚本

以下是加拿大温哥华不列颠哥伦比亚大学计算机科学和商科本科生Ashcon Partovi的客座帖子。他是流行的Minecraft多人游戏服务器的创始人,stratus.网络,每周为成千上万的玩家提供有竞争力的、基于团队的游戏体验如果你在过去的几年里玩过电子游戏,你很有可能了解Minecraft。你可能对这个游戏很熟悉,甚至种了一两棵树,但你可能不知道的是大量的Minecraft在线社区。在这篇文章中,我将描述我如何使用Cloudflare Workers来部署和扩展一个产品级API,该API解决了这些Minecraft网站的一个大问题。介绍问题这里有一个例子,我的Minecraft玩家档案从一个多人游戏网站。它显示一些身份信息,如我的用户名、头像的位图和朋友的预览。虽然用49个位图头像来呈现这个页面看起来很简单,但它远不是一件小事。事实上,这是不必要的复杂。以下是在给定用户名的网站上呈现玩家档案的当前工作流:从玩家的用户名中找到UUID。卷曲api.mojang.com/users/profiles/minecraft/electronidfilms{"id":"dad8b95ccf6a44df982e8c8dd70201e0","name":"电子胶片"}使用该UUID从会话服务器获取最新的播放器信息。卷曲sessionserver.mojang.com/session/minecraft/profile/dad8b95cc...{"id":"dad8b95ccf6a44df982e8c8dd70201e0","name":"电子胶片","属性":[{"name":"纹理","value":"eyJ0aW1lc3RhbXAiOjE1MzI1MDI…"//}]}解码编码为base64的纹理字符串。echo"eyJ0aW1lc3RhbXAiOjE1MzI1MDIwNDY5NjIsIn…"base64—解码{"时间戳":1532502046962,"profileId":"dad8b95ccf6a44df982e8c8dd70201e0","profileName":"电子胶片","纹理":{"皮肤":{"url":textures.minecraft.net/texture/741df6aa0..."},"CAPE":{"url":textures.minecraft.net/texture/e7dfea16d..."}}}从解码后的JSON负载中的URL获取纹理。卷曲textures.minecraft.net/texture/741df6aa027... > 皮肤.png在数据库中缓存纹理以避免60秒的速率限制。蒙哥> db.users.findOneAndUpdate({u id:"dad8b95ccf6a44df982e8c8dd70201e0"},{skin_png:new BinData(0,"GWA3u4F42GIH318sAlN2wfDAWTQ…")})哎呀,渲染一个虚拟人物需要5个复杂的操作!但这并不是全部,在我的示例配置文件中,有49个化身,这将需要总共5*49=245次操作。这只是获取数据,我们还没有开始为玩家提供数据!然后,您必须设置一个主机来为web流量提供服务,确保服务随需求扩展,处理资产的缓存过期,并跨多个区域进行部署。那你就得部署那里一定有更好的方法!与工人一起制作原型我坚信无服务器计算的未来。因此,当我了解到Cloudflare Workers如何允许您在150多个存在点上运行JavaScript代码时,我开始尝试解决这个问题的可能性。在看了文档并使用Workers playground之后,我很快将一些JavaScript代码组合在一起,将所有的概要文件复杂性聚合到一个请求中。addEventListener('fetch',事件=>{事件响应(renderPlayerBitmap(事件请求))})异步函数renderPlayerBitmap(请求){var用户名=请求.url.split("/").pop()控制台.log("开始请求…"+用户名)//步骤1:用户名->UUIDvar uuid=等待获取("https://api.mojang.com/users/profiles/minecraft/"+用户名)如果(好的) {uuid=(等待uuid.json文件()).id控制台.log("找到uuid…"+uuid)//步骤2:UUID->Profilevar session=等待获取("https://sessionserver.mojang.com/session/minecraft/profile/"+uuid)如果(会话。好的) {会话=等待会话.json()控制台.log("找到会话…"+ JSON.stringify(会议)//步骤3:配置文件->纹理URLvar纹理=atob(会话.属性[0].值)控制台.log("找到纹理…"+纹理)//步骤4+5:纹理URL->纹理PNG+缓存纹理=JSON.parse(纹理)取回(纹理.纹理.皮肤.url,cf:{cacheTtl:60})}}返回新响应(未定义,{status:500})}几分钟之内,我就有了我的第一个工人实现!我给了它我的用户名,它能够发出所有必要的子请求来返回我的播放器的位图纹理。在意识到工人的潜力后,我开始怀疑是否可以将其用于不仅仅是一个脚本。如果我可以为Minecraft设计并部署一个只在工人上运行的、可供生产使用的API呢?设计API我想为Minecraft开发人员解决一个基本问题:太多的api和太多的限制。解析多个请求和处理错误的麻烦使开发人员无法集中精力为玩家创造出色的体验。需要一个解决方案,只需要一个HTTP请求,没有速率限制和客户端缓存。在查看了现有API的各种用例之后,我创建了一个JSON模式,它将所有基本数据包含在单个响应中:获取:api.ashcon.app/mojang/v1/user/{"uuid":"","用户名":"","用户名历史记录":[{"用户名":"","更改时间为":""}],"纹理":{"slim":"","自定义":"","皮肤":{"url":"","数据":""},"海角":{"url":"","data":""}},"缓存位置":""}我心中的一个主要目标是尽量减少客户的子请求。例如,与其给开发人员一个image/png静态资产的URL,为什么不为他们获取它并将其作为base64字符串嵌入呢?这就是简单!入门对于这个项目,我决定使用CoffeeScript,它可以跨编译到JavaScript,语法简单。我们还需要使用Webpack将所有代码打包到一个JavaScript文件中,然后上传到Cloudflare。#欢迎使用CoffeeScript!str="嘿!#{40+2}"嘿嘿!42英尺如果是str,num=12?#十二arr=[1,空,"apple"]#[1,null,"apple"]val=arr[1]?。length()#空hash={key:'值'}key:"值"add=(a,b,{c,d}={})->c呢?=3d?=4个a+b+c+d加(1,2,d:5)#1+2+3+5=11首先,让我们确保为项目安装了正确的依赖项!这些命令将创建包.json文件和我们工作区中的node\u modules/folder。mkdir-p工作区/srccd工作区npm init--是npm install--save dev webpack webpack cli coffeescript咖啡加载器工人预览现在,我们要编辑包.json为以后添加两个助手脚本。您也可以删除默认的"test"脚本。"脚本":{"build":"网页包","建筑:手表":"网页包--观看","preview":"工人预览