package minecraft import ( "compress/gzip" "github.com/ppacher/nbt" lua "github.com/yuin/gopher-lua" "meow.tf/residentsleeper/events" "os" "path" "sync" ) var ( BasePath string WorldPath string uuids = make(map[string]string) uuidLock sync.RWMutex ) func init() { events.On(events.Authenticated, onAuthenticated) events.On(events.Leave, onLeave) } func onAuthenticated(args ...interface{}) { name := args[0].(string) uuid := args[1].(string) uuidLock.Lock() defer uuidLock.Unlock() uuids[name] = uuid } func onLeave(args ...interface{}) { uuidLock.Lock() defer uuidLock.Unlock() delete(uuids, args[0].(string)) } func GetUUID(name string) (string, bool) { uuidLock.RLock() defer uuidLock.RUnlock() uuid, exists := uuids[name] return uuid, exists } func Loader(L *lua.LState) int { // register functions to the table mod := L.SetFuncs(L.NewTable(), exports) // returns the module L.Push(mod) return 1 } var exports = map[string]lua.LGFunction{ "getUUID": getUuidFunc, "loadPlayer": loadPlayerFunc, "isOp": isOpFunc, } func getUuidFunc(L *lua.LState) int { name := L.CheckString(1) uuid, exists := GetUUID(name) if exists { L.Push(lua.LString(uuid)) } else { L.Push(lua.LNil) } return 1 } func loadPlayerFunc(L *lua.LState) int { name := L.CheckString(1) uuid, exists := GetUUID(name) if !exists { L.Push(lua.LNil) L.Push(lua.LString("User does not exist")) return 2 } playerPath := path.Join(WorldPath, "playerdata", uuid+".dat") f, err := os.Open(playerPath) if err != nil { L.Push(lua.LNil) L.Push(lua.LString(err.Error())) return 2 } defer f.Close() r, err := gzip.NewReader(f) if err != nil { L.Push(lua.LNil) L.Push(lua.LString(err.Error())) return 2 } defer r.Close() tag, err := nbt.ReadNamedTag(r) if err != nil { L.Push(lua.LNil) L.Push(lua.LString(err.Error())) return 2 } L.Push(TagToLuaValue(L, tag)) L.Push(lua.LNil) return 2 }