// lua向go发送数据 funclua_Send(state *lua.State)int { l := ToLua(state.Index) if l == nil { state.ArgError(1, "error runtime") return-1 } if l.callbackLuaToGo != nil { v := l.callbackLuaToGo(l) l.chanToGo <- v } else { var data map[string]interface{} v := lua_luar.LuaToGo(l.State, 1, &data) l.chanToGo <- v } return0 }
// lua接收来自go的数据 funclua_Recv(state *lua.State)int { l := ToLua(state.Index) if l == nil { state.ArgError(1, "error runtime") return-1 } data, ok := <-l.chanToLua if !ok { state.PushNil() return1 } if l.callbackGoToLua != nil { return l.callbackGoToLua(l, data) } else { lua_luar.GoToLua(l.State, data) return1 } }
-- 封装Context.Data local DoneJson = function(evt, code, tb) if evt == nilthen return end if evt.Context ~= nilthen evt.Context:Data(code, "application/json", json.encode(tb)) end if evt.Complete ~= nilthen evt.Complete() end end
-- 封装Context.File local DoneFile = function(evt, fp, size) if evt == nilthen return end if evt.Context ~= nilthen evt.Context:FileStream(fp, size) end if evt.Complete ~= nilthen evt.Complete() end end
--从channel接收请求,并执行对应的逻辑 localfunctionmain() -- ...... whiletruedo -- ...... local evt = core.Recv() if evt == nilthen break end local Route = evt.Route if Plugin[Route] ~= nilthen unsafe_xpcall(Plugin[Route], function(err) debug.PrintWarn("处理事件[%s]失败: %s", Route, err) DoneJson(evt, 500, { error = err }) end, Plugin, evt) end end end
functionPlugin:get(evt) local c = evt.Context local md5 = c:Query("id") -- 获取歌曲id if #md5 <= 0then DoneJson(evt, 500, { error = "error id" }) return end local item = nil -- 从缓存数据中查找对应的歌曲 for _, v inpairs(self.MusicList) do if v.MD5 == md5 then item = v break end end if item == nilthen DoneJson(evt, 500, { error = "error id" }) return end -- 将歌曲返回 DoneFile(evt, item.FPath, self.ChunkSize) end
-- context对象可通过ch,从go发送至lua端 channel.select( { "|<-", chIn, function(ok, context) if ok then -- ...处理请求... -- 调用go对象context的String方法 context:String("success") end end }, )
const body = { tag, page, } const result = await axios.post(`${URL}getrecommendsheetsbytag`, body)
getMusicSheetInfo,同上直接发起请求。逻辑交由服务器实现
1 2 3 4 5
const body = { sheetItem, page, } const result = await axios.post(`${URL}getmusicsheetinfo`, body)
服务器实现
1. getRecommendSheetTags
简单实现,直接返回三个固定即可
1 2 3 4 5 6 7
return { pinned = { { title = "歌手", artist = "歌手", id = "歌手" }, { title = "翻唱", artist = "翻唱", id = "翻唱" }, { title = "我喜欢", artist = "我喜欢", id = "我喜欢" } }, }
-- 按歌手分组 functionSheet:InitArtist(MusicList) self.Artist = {} for _, item inpairs(MusicList) do ifself.Artist[item.Artist] == nilthen self.Artist[item.Artist] = {} end local list = self.Artist[item.Artist] list[#list + 1] = item end local temp = {} for k, v inpairs(self.Artist) do if #v <= 1then temp[#temp + 1] = v[1] self.Artist[k] = nil end end for k, v inpairs(self.Artist) do for i = #temp, 1, -1do local item = temp[i] if (string.includes(item.Artist, k) orstring.includes(k, item.Artist)) then v[#v + 1] = item table.remove(temp, i) end end end end -- 按歌曲名分组 functionSheet:InitTitle(MusicList) self.Title = {} for _, item inpairs(MusicList) do ifself.Title[item.Title] == nilthen self.Title[item.Title] = {} end local list = self.Title[item.Title] list[#list + 1] = item end for k, v inpairs(self.Title) do if #v <= 1then self.Title[k] = nil end end end
functionSheet:getRecommendSheetsByTag(tag, page, PageCount) local list = nil if tag.id == "我喜欢"or tag.title == "默认"then list = { { title = "我喜欢", artist = "我喜欢", id = "我喜欢", } } elseif tag.title == "歌手"then list = array.map(self.Artist, function(v, k) return { title = k, artist = k, id = k, } end) elseif tag.title == "翻唱"then list = array.map(self.Title, function(v, k) return { title = k, artist = k, id = k, } end) end if list == nilthen return { isEnd = true, data = {} } end
functionSheet:getMusicSheetInfo(sheetItem, page, PageCount) local list = nil if sheetItem.id == "我喜欢"then list = self.MusicList elseifself.Artist[sheetItem.id] ~= nilthen list = self.Artist[sheetItem.id] elseifself.Title[sheetItem.id] ~= nilthen list = self.Title[sheetItem.id] end if list == nilthen return { isEnd = true, musicList = {} } end
// old funcGetModel(w http.ResponseWriter, req *http.Request) { // --- skip --- var path string switch modelList.Models[modelId].(type) { casestring: path = modelList.Models[modelId].(string) case []interface{}: path = modelList.Models[modelId].([]interface{})[textureId].(string)
}
model := GetModelData(path) // --- skip --- }
// new func(u *Live2D) getModel(c *gin.Context) { // --- skip --- var path string switch modelList.Models[modelId].(type) { casestring: path = modelList.Models[modelId].(string) case []interface{}: path = modelList.Models[modelId].([]interface{})[textureId].(string) textureId = -1 }
model := getModelData(path, textureId) // --- skip --- }
// 获取index.json funcgetModelData(path string, texId int) ModelData { // Open our jsonFile jsonFile, err := os.Open(live2d_resources + "model/" + path + "/index.json") // if we os.Open returns an error then handle it if err != nil { fmt.Println(err) } // defer the closing of our jsonFile so that we can parse it later on defer jsonFile.Close() byteValue, _ := io.ReadAll(jsonFile) var model ModelData json.Unmarshal(byteValue, &model)
if texId > -1 { getTextures(&model, path, texId) }
changeDataPathInModel(&model, path) return model }
// 获取textures.cache中的值 funcgetTextures(data *ModelData, path string, id int) { cacheFile, err := os.Open(live2d_resources + "model/" + path + "/textures.cache") if err != nil { return } defer cacheFile.Close() byteValue, _ := io.ReadAll(cacheFile) var list []interface{} json.Unmarshal(byteValue, &list)
switch list[id].(type) { casestring: data.Textures = []string{list[id].(string)} case []interface{}: data.Textures = []string{} for _, s := range list[id].([]interface{}) { data.Textures = append(data.Textures, s.(string)) } } }