online multiplayer chess game (note server currently down)
Diffstat (limited to 'ui/chat/Chat.gd')
| -rw-r--r-- | ui/chat/Chat.gd | 82 |
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 |