about summary refs log tree commit diff
path: root/pkg
diff options
context:
space:
mode:
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)
+}