online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/chat/Chat.gd')
-rw-r--r--ui/chat/Chat.gd82
1 files changed, 82 insertions, 0 deletions
diff --git a/ui/chat/Chat.gd b/ui/chat/Chat.gd
new file mode 100644
index 0000000..65eedfc
--- /dev/null
+++ b/ui/chat/Chat.gd
@@ -0,0 +1,82 @@
+extends Control
+
+onready var labels = find_node("labels")
+onready var text: TextEdit = find_node("text")
+onready var scroller = find_node("scroller")
+onready var scrollbar = scroller.get_v_scrollbar()
+
+const server_says = "[b]server[color=#f0e67e]:[/color][/b] "
+
+var tween = Tween.new()
+var regexes: Array = [
+ [compile("_([^_]+)_"), "[i]$1[/i]"],
+ [compile("\\*\\*([^\\*\\*]+)\\*\\*"), "[b]$1[/b]"],
+ [compile("\\*([^\\*]+)\\*"), "[i]$1[/i]"],
+ [compile("```([^`]+)```"), "[code]$1[/code]"],
+ [compile("`([^`]+)`"), "[code]$1[/code]"],
+ [compile("~~([^~]+)~~"), "[s]$1[/s]"],
+ [compile("#([^#]+)#"), "[rainbow freq=.3 sat=.7]$1[/rainbow]"],
+ [compile("%([^%]+)%"), "[shake rate=20 level=25]$1[/shake]"]
+]
+
+
+func _ready():
+ if Globals.network:
+ Globals.network.connect("chat", self, "add_label_with")
+ add_child(tween)
+ add_label("%s[b]welcome!" % server_says, "server")
+ yield(get_tree().create_timer(.4), "timeout")
+ add_label("%s[b]you can use markdown(sort of)!" % server_says)
+
+
+static func compile(src: String) -> RegEx:
+ var regex := RegEx.new()
+ regex.compile(src)
+ return regex
+
+
+func add_label_with(data):
+ var string = "[b]%s[color=#f0e67e]:[/color][/b] %s" % [data.who, data.text]
+ add_label(string)
+
+
+func add_label(bbcode: String, name = "richtextlabel", size = Vector2(rect_size.x, 35)) -> RichTextLabel:
+ var l = RichTextLabel.new()
+ l.name = name
+ l.rect_min_size = size
+ l.bbcode_enabled = true
+ l.scroll_active = false
+ labels.add_child(l)
+ l.connect("meta_clicked", self, "open_url")
+ l.bbcode_text = bbcode
+ # l.fit_content_height = true
+ tween.interpolate_property(scrollbar, "value", scrollbar.value, scrollbar.max_value, .5, Tween.TRANS_BOUNCE)
+ tween.start()
+ return l
+
+
+func open_url(meta):
+ OS.shell_open(meta)
+
+
+func send(_arg = 0):
+ var t = text.get_text().strip_edges()
+ if !t:
+ return
+ t = translate_md(t)
+ text.text = ""
+ var name_data = SaveLoad.access_data("id").name
+ var name = name_data if name_data else "Anonymous"
+ Globals.network.relay_signal({"text": t, "who": name if name else "Anonymous"}, Network.RELAYHEADERS.chat)
+
+
+# markdown to bbcode
+func translate_md(input: String) -> String:
+ for replacement in regexes:
+ input = replacement[0].sub(input, replacement[1])
+ return input
+
+
+func err(err: String):
+ add_label("[b][color=#ff6347]error:[i] %s" % err)
+ text.editable = false