Evaluate gdscript code
Diffstat (limited to 'Eval.gd')
-rw-r--r--Eval.gd53
1 files changed, 53 insertions, 0 deletions
diff --git a/Eval.gd b/Eval.gd
new file mode 100644
index 0000000..803df2a
--- /dev/null
+++ b/Eval.gd
@@ -0,0 +1,53 @@
+extends Node
+
+const prefix = "!e"
+
+var expr = Expression.new()
+
+func _ready():
+ var bot := DiscordBot.new()
+ add_child(bot)
+ var file = File.new()
+ var err = file.open("res://token", File.READ)
+ var token
+ if err == OK:
+ token = file.get_as_text()
+ elif OS.has_environment("TOKEN"):
+ token = OS.get_environment("TOKEN")
+ else:
+ push_error("token missing")
+ bot.TOKEN = token
+ bot.connect("bot_ready", self, "_on_bot_ready")
+ bot.connect("message_create", self, "_on_message_create")
+ bot.login()
+
+
+func _on_bot_ready(bot: DiscordBot):
+ print("Logged in as " + bot.user.username + "#" + bot.user.discriminator)
+ print("Listening on " + str(bot.channels.size()) + " channels and " + str(bot.guilds.size()) + " guilds.")
+
+func _on_message_create(bot: DiscordBot, message: Message, _channel: Dictionary):
+ if message.author.bot or message.content.split(" ")[0] != prefix:
+ return
+ var reg = RegEx.new()
+ reg.compile("`+([^`]+)`+")
+ var res = reg.search(message.content)
+ var code = res.strings[1] if res else message.content.substr(len(prefix) + 1)
+ var lines = code.split("\n")
+ if res and lines[0] in ["swift", "py", "c", "c++"]:
+ lines.remove(0)
+ code = lines.join("\n")
+
+ var skip = false
+ var error = expr.parse(code, [])
+ if error != OK:
+ bot.send(message, str(expr.get_error_text()) if expr.get_error_text() else "null")
+ skip = true
+
+ if not skip:
+ var result = expr.execute([], null, true)
+ if not expr.has_execute_failed():
+ bot.send(message, str(result) if result else "null")
+ return
+ bot.send(message, "Execution of \n```swift\n%s\n``` Has failed" % code + ( ": " + expr.get_error_text() if expr.get_error_text() else "."))
+