latex bot discord
Diffstat (limited to 'Latex.gd')
| -rw-r--r-- | Latex.gd | 106 |
1 files changed, 21 insertions, 85 deletions
@@ -1,21 +1,6 @@ extends Node -var template_tex := """ -\\documentclass[varwidth=true]{standalone} -\\usepackage[utf8]{inputenc} -\\usepackage{xcolor} -\\usepackage{amsmath} - -\\color{white} -\\begin{document} - -%s - -\\end{document} -""" - -var f := File.new() -var thread_pool := [] +const laTeXture := preload("./addons/GodoTeX/LaTeXture.cs") func compile(source: String) -> RegEx: @@ -24,19 +9,12 @@ func compile(source: String) -> RegEx: return reg -func _ready(): - for _i in range(5): - thread_pool.append(Thread.new()) - var dir = Directory.new() - if !dir.dir_exists("res://texs"): - dir.make_dir("texs") - f.open("res://texs/.gdignore", File.WRITE) # touch .gdignore - f.close() +func _ready() -> void: var bot := DiscordBot.new() add_child(bot) - var file = File.new() - var err = file.open("res://token", File.READ) - var token + var file := File.new() + var err := file.open("res://token", File.READ) + var token: String if err == OK: token = file.get_as_text() elif OS.has_environment("TOKEN"): @@ -50,13 +28,13 @@ func _ready(): bot.login() -func _on_bot_ready(bot: DiscordBot): +func _on_bot_ready(bot: DiscordBot) -> void: bot.set_presence({"activity": {"type": "Game", "name": "Printing LaTeX"}}) 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): +func _on_message_create(bot: DiscordBot, message: Message, _channel: Dictionary) -> void: if message.author.bot: return var msg: String @@ -73,61 +51,19 @@ func _on_message_create(bot: DiscordBot, message: Message, _channel: Dictionary) msg = msg.strip_edges() - print("----\n%s\n----" % msg) if !msg: return - - var th: Thread - for thread in thread_pool: - if !thread.is_alive(): - th = thread - break - if !th: - thread_pool.append(Thread.new()) - th = thread_pool[-1] - - th.start(self, "latex2img", template_tex % msg) - while true: - yield(get_tree(), "idle_frame") - if !th.is_alive(): - var img = th.wait_to_finish() - if img is Dictionary: - bot.reply(message, "No({err}): `{output}`".format(img)) - return - bot.reply( - message, - "Tex:", - {"files": [{"name": "code.png", "media_type": "image/png", "data": img.save_png_to_buffer()}]} - ) - return - - -func _notification(what): - if what == NOTIFICATION_EXIT_TREE: - OS.execute("bash", ["-c", "rm -r texs"], false) - - -func latex2img(latex: String): - randomize() - var name := ("%s-%s" % [randi() % 201, randi() % 201]).c_escape() - f.open("res://texs/%s.tex" % name, File.WRITE_READ) - f.store_string(latex) - f.close() - var output: PoolStringArray = [] - var err = OS.execute( - "bash", ["-c", "cd texs && latex -interaction=nonstopmode '%s.tex'" % name], true, output, true - ) - if err: - return {err = err, output = "(la)" + output.join(" ")} - output.resize(0) - var dvipng = [ - "-c", - "dvipng -strict -bg Transparent --png -Q 250 -D 250 -T tight -o 'texs/%s.png' 'texs/%s.dvi'" % [name, name] - ] - err = OS.execute("bash", dvipng, true, output, true) - if err: - return {err = err, output = "(dvi)" + output.join(" ")} - var img := Image.new() - err = img.load("res://texs/%s.png" % name) - OS.execute("bash", ["-c", "rm 'texs/%s.'*" % name], false) - return img + + print("----\n%s\n----" % msg) + var img := latex2img(msg) + bot.reply(message, "Tex:", {"files": [{"name": "code.png", "media_type": "image/png", "data": img}]}) + + +func latex2img(latex: String) -> PoolByteArray: + var tex := laTeXture.new() + tex.LatexExpression = latex + tex.MathColor = Color.white + tex.Fill = true + tex.FontSize = 80 + tex.Render() + return tex.get_data().save_png_to_buffer() |