Evaluate gdscript code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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 "."))