aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-06-14 00:20:51 +0000
committerGitHub <noreply@github.com>2022-06-14 00:20:51 +0000
commit5bee62d524bd3b4ac8cb2b081e508d518113d25c (patch)
treef16d767c6ef9a11d5c9889a0c04f18a29ff21c4f /pkg
parent6d32e22018bd6b088365c4f771f5163596ba122f (diff)
downloadjinx-5bee62d524bd3b4ac8cb2b081e508d518113d25c.tar.zst
jinx-5bee62d524bd3b4ac8cb2b081e508d518113d25c.zip
Add basic Lang command
Diffstat (limited to 'pkg')
-rw-r--r--pkg/bot/cmds.go52
1 files changed, 52 insertions, 0 deletions
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)
+}