online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/chat/Chat.gd')
-rw-r--r--ui/chat/Chat.gd57
1 files changed, 38 insertions, 19 deletions
diff --git a/ui/chat/Chat.gd b/ui/chat/Chat.gd
index e529720..2631750 100644
--- a/ui/chat/Chat.gd
+++ b/ui/chat/Chat.gd
@@ -1,12 +1,11 @@
extends Control
+class_name Chat
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]"],
@@ -16,17 +15,31 @@ var regexes: Array = [
[compile("`([^`]+)`"), "[code]$1[/code]"],
[compile("~~([^~]+)~~"), "[s]$1[/s]"],
[compile("#([^#]+)#"), "[rainbow freq=.3 sat=.7]$1[/rainbow]"],
- [compile("%([^%]+)%"), "[shake rate=20 level=25]$1[/shake]"]
+ [compile("%([^%]+)%"), "[shake rate=20 level=25]$1[/shake]"],
+ [compile("\\[([^\\]]+)\\]\\(([^\\)]+)\\)"), "[url=$2]$1[/url]"],
+ [compile("((res://)?(http(s)?://.)?(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*))"), "[url]$1[/url]"],
]
+func server(txt: String) -> void:
+ add_label("[b]server[color=#f0e67e]:[/color] " + md2bb(txt))
+
+
+func _init():
+ Globals.chat = self
+
+
+func _exit_tree():
+ Globals.chat = null
+
+
func _ready():
if Globals.network:
Globals.network.connect("chat", self, "add_label_with")
add_child(tween)
- add_label("%s[b]welcome!" % server_says, "server")
+ server("Welcome!")
yield(get_tree().create_timer(.4), "timeout")
- add_label("%s[b]you can use markdown(sort of)!" % server_says)
+ server("You can use markdown(sort of)!")
static func compile(src: String) -> RegEx:
@@ -40,10 +53,8 @@ func add_label_with(data):
add_label(string)
-func add_label(
- bbcode: String, name = "richtextlabel", size = Vector2(rect_size.x, 35)
-) -> RichTextLabel:
- var l = RichTextLabel.new()
+func add_label(bbcode: String, name = "text", size = Vector2(rect_size.x, 0)) -> RichTextLabel:
+ var l := RichTextLabel.new()
l.name = name
l.rect_min_size = size
l.bbcode_enabled = true
@@ -51,10 +62,8 @@ func add_label(
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
- )
+ l.fit_content_height = true
+ tween.interpolate_property(scrollbar, "value", scrollbar.value, scrollbar.max_value, .5, Tween.TRANS_BOUNCE)
tween.start()
return l
@@ -67,19 +76,29 @@ func send(_arg = 0):
var t = text.get_text().strip_edges()
if !t:
return
- t = translate_md(t)
+ t = md2bb(t)
text.text = ""
var name_data = SaveLoad.get_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
- )
+ name += "(%s)" % ("Spectator" if Globals.spectating else Globals.get_team())
+ if Globals.network:
+ Globals.network.relay_signal({"text": t, "who": name}, Network.RELAYHEADERS.chat)
+ else:
+ add_label_with({text = t, who = name}) # for testing
# markdown to bbcode
-func translate_md(input: String) -> String:
+func md2bb(input: String) -> String:
for replacement in regexes:
- input = replacement[0].sub(input, replacement[1])
+ var result = replacement[0].search(input)
+ if result:
+ var index = input.find(result.strings[0]) - 1
+ var char_before = input[index]
+ if not char_before in "\\": # taboo characters go here
+ if replacement[1] == "[url]$1[/url]" and result.strings[3] == "res://": # url one must avoid recognizing res://
+ continue
+ input = replacement[0].sub(input, replacement[1], true)
+ input = input.replace("\\", "") # remove escapers
return input