From 5bee62d524bd3b4ac8cb2b081e508d518113d25c Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 14 Jun 2022 00:20:51 +0000 Subject: Add basic Lang command --- pkg/bot/cmds.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/pkg/bot/cmds.go b/pkg/bot/cmds.go index e28d22f..ec0a943 100644 --- a/pkg/bot/cmds.go +++ b/pkg/bot/cmds.go @@ -1,7 +1,11 @@ package bot import ( + "fmt" "jinx/pkg/discord/events" + "jinx/pkg/lang/compiler" + "jinx/pkg/lang/parser" + "jinx/pkg/lang/scanner" "jinx/pkg/lang/vm" "jinx/pkg/lang/vm/text" "strings" @@ -13,6 +17,7 @@ var ( nameToCmd = map[string]Cmd{ "ping": pingCmd, "vm": vmCmd, + "lang": langCmd, } ) @@ -45,3 +50,50 @@ func vmCmd(b *Bot, content string, msg events.Message) error { return b.client.SendMessage(msg.ChannelID, res) } + +func langCmd(b *Bot, content string, msg events.Message) error { + src := strings.Split(content, "```")[1] + + scanner := scanner.New(strings.NewReader(src)) + tokens, err := scanner.Scan() + if err != nil { + return err + } + + parser := parser.New(tokens) + program, err := parser.Parse() + if err != nil { + return err + } + + comp := compiler.New(program) + bc, err := comp.Compile() + if err != nil { + b.logger.Error().Err(err).Msg("error compiling code") + return err + } + + b.client.SendMessage(msg.ChannelID, "successfully compiled code") + + decomp := text.NewDecompiler(bc) + decompRes := decomp.Decompile() + + b.client.SendMessage(msg.ChannelID, fmt.Sprintf("resulting decompiled bytecode:\n```\n%s\n```", decompRes)) + + vm := vm.New(&bc) + + b.client.SendMessage(msg.ChannelID, "executing code...") + + if err := vm.Run(); err != nil { + return err + } + + res, err := vm.GetResult() + if err != nil { + return err + } + + b.logger.Debug().Msg("executed code") + + return b.client.SendMessage(msg.ChannelID, res) +} -- cgit 1.4.1