2021-03-20 22:49:15 +00:00
|
|
|
package commander
|
|
|
|
|
|
|
|
import (
|
2021-10-16 16:40:53 +00:00
|
|
|
"hilbish/util"
|
|
|
|
|
2022-04-04 10:40:02 +00:00
|
|
|
rt "github.com/arnodel/golua/runtime"
|
|
|
|
"github.com/arnodel/golua/lib/packagelib"
|
2021-03-20 22:49:15 +00:00
|
|
|
"github.com/chuckpreslar/emission"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Commander struct{
|
|
|
|
Events *emission.Emitter
|
2022-04-04 10:40:02 +00:00
|
|
|
Loader packagelib.Loader
|
2021-03-20 22:49:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func New() Commander {
|
2022-04-04 10:40:02 +00:00
|
|
|
c := Commander{
|
2021-03-20 22:49:15 +00:00
|
|
|
Events: emission.NewEmitter(),
|
|
|
|
}
|
2022-04-04 10:40:02 +00:00
|
|
|
c.Loader = packagelib.Loader{
|
|
|
|
Load: c.loaderFunc,
|
|
|
|
Name: "commander",
|
|
|
|
}
|
|
|
|
|
|
|
|
return c
|
2021-03-20 22:49:15 +00:00
|
|
|
}
|
|
|
|
|
2022-04-04 10:40:02 +00:00
|
|
|
func (c *Commander) loaderFunc(rtm *rt.Runtime) (rt.Value, func()) {
|
|
|
|
exports := map[string]util.LuaExport{
|
|
|
|
"register": util.LuaExport{c.cregister, 2, false},
|
|
|
|
"deregister": util.LuaExport{c.cderegister, 1, false},
|
2021-03-20 22:49:15 +00:00
|
|
|
}
|
2022-04-04 10:40:02 +00:00
|
|
|
mod := rt.NewTable()
|
|
|
|
util.SetExports(rtm, mod, exports)
|
|
|
|
util.Document(mod, "Commander is Hilbish's custom command library, a way to write commands in Lua.")
|
2021-03-20 22:49:15 +00:00
|
|
|
|
2022-04-04 10:40:02 +00:00
|
|
|
return rt.TableValue(mod), nil
|
2021-03-20 22:49:15 +00:00
|
|
|
}
|
|
|
|
|
2021-10-16 14:21:05 +00:00
|
|
|
// register(name, cb)
|
|
|
|
// Register a command with `name` that runs `cb` when ran
|
2022-02-25 22:15:25 +00:00
|
|
|
// --- @param name string
|
|
|
|
// --- @param cb function
|
2022-04-04 10:40:02 +00:00
|
|
|
func (c *Commander) cregister(t *rt.Thread, ct *rt.GoCont) (rt.Cont, error) {
|
|
|
|
cmdName, cmd, err := util.HandleStrCallback(t, ct)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-03-20 22:49:15 +00:00
|
|
|
|
|
|
|
c.Events.Emit("commandRegister", cmdName, cmd)
|
|
|
|
|
2022-04-04 10:40:02 +00:00
|
|
|
return ct.Next(), err
|
2021-03-20 22:49:15 +00:00
|
|
|
}
|
|
|
|
|
2021-10-16 14:21:05 +00:00
|
|
|
// deregister(name)
|
|
|
|
// Deregisters any command registered with `name`
|
2022-02-25 22:15:25 +00:00
|
|
|
// --- @param name string
|
2022-04-04 10:40:02 +00:00
|
|
|
func (c *Commander) cderegister(t *rt.Thread, ct *rt.GoCont) (rt.Cont, error) {
|
|
|
|
if err := ct.Check1Arg(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
cmdName, err := ct.StringArg(0)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2021-06-12 14:30:47 +00:00
|
|
|
|
|
|
|
c.Events.Emit("commandDeregister", cmdName)
|
|
|
|
|
2022-04-04 10:40:02 +00:00
|
|
|
return ct.Next(), err
|
2021-06-12 14:30:47 +00:00
|
|
|
}
|