bugfix, classes now replace the cmd_data and sender_data with classes

This commit is contained in:
MennoMax 2019-10-27 01:22:21 +02:00
parent b0ac64182f
commit 70f363bfe7
4 changed files with 58 additions and 22 deletions

View File

@ -52,7 +52,7 @@ enum WhereFlag {
func _init(): func _init():
websocket.verify_ssl = true websocket.verify_ssl = true
user_regex.compile("(?<=!)[\\w]*(?=Q)") user_regex.compile("(?<=!)[\\w]*(?=@)")
func _ready() -> void: func _ready() -> void:
websocket.connect("data_received", self, "data_received") websocket.connect("data_received", self, "data_received")
@ -125,7 +125,7 @@ func add_command(cmd_name : String, instance : Object, instance_func : String, p
var func_ref = FuncRef.new() var func_ref = FuncRef.new()
func_ref.set_instance(instance) func_ref.set_instance(instance)
func_ref.set_function(instance_func) func_ref.set_function(instance_func)
commands[cmd_name] = [func_ref, permission_level, max_args, min_args, where] commands[cmd_name] = CommandData.new(func_ref, permission_level, max_args, min_args, where)
# Removes a single command or alias. # Removes a single command or alias.
func remove_command(cmd_name : String) -> void: func remove_command(cmd_name : String) -> void:
@ -137,7 +137,7 @@ func purge_command(cmd_name : String) -> void:
if(to_remove): if(to_remove):
var remove_queue = [] var remove_queue = []
for command in commands.keys(): for command in commands.keys():
if(commands[command][0] == to_remove[0]): if(commands[command].func_ref == to_remove.func_ref):
remove_queue.append(command) remove_queue.append(command)
for queued in remove_queue: for queued in remove_queue:
commands.erase(queued) commands.erase(queued)
@ -165,50 +165,47 @@ func handle_message(message : String, tags : Dictionary) -> void:
print_debug("Authentication successful.") print_debug("Authentication successful.")
emit_signal("login_attempt", true) emit_signal("login_attempt", true)
"PRIVMSG": "PRIVMSG":
var sender_data : Array = [user_regex.search(msg[0]), msg[2], tags] var sender_data : SenderData = SenderData.new(user_regex.search(msg[0]).get_string(), msg[2], tags)
handle_command(sender_data, msg) handle_command(sender_data, msg)
emit_signal("chat_message", sender_data, msg[3].right(1)) emit_signal("chat_message", sender_data, msg[3].right(1))
"WHISPER": "WHISPER":
var sender_data : Array = [user_regex.search(msg[0]), msg[2], tags] var sender_data : SenderData = SenderData.new(user_regex.search(msg[0]).get_string(), msg[2], tags)
handle_command(sender_data, msg, true) handle_command(sender_data, msg, true)
emit_signal("whisper_message", sender_data, msg[3].right(1)) emit_signal("whisper_message", sender_data, msg[3].right(1))
_: _:
emit_signal("unhandled_message", message, tags) emit_signal("unhandled_message", message, tags)
func handle_command(sender_data : Array, msg : PoolStringArray, whisper : bool = false) -> void: func handle_command(sender_data : SenderData, msg : PoolStringArray, whisper : bool = false) -> void:
if(command_prefixes.has(msg[3].substr(1, 1))): if(command_prefixes.has(msg[3].substr(1, 1))):
var command : String = msg[3].right(2) var command : String = msg[3].right(2)
var cmd_data = commands.get(command) var cmd_data : CommandData = commands.get(command)
if(cmd_data): if(cmd_data):
var args = "" if msg.size() < 5 else msg[4] var args = "" if msg.size() < 5 else msg[4]
var arg_ary : PoolStringArray = PoolStringArray() if args == "" else args.split(" ") var arg_ary : PoolStringArray = PoolStringArray() if args == "" else args.split(" ")
if(arg_ary.size() > cmd_data[2] && cmd_data[2] != -1): if(arg_ary.size() > cmd_data.max_args && cmd_data.max_args != -1 || arg_ary.size() < cmd_data.min_args):
emit_signal("cmd_invalid_argcount", command, sender_data, cmd_data, arg_ary) emit_signal("cmd_invalid_argcount", command, sender_data, cmd_data, arg_ary)
print_debug("Invalid argcount!") print_debug("Invalid argcount!")
return return
if(arg_ary.size() < cmd_data[3]): if(cmd_data.permission_level != 0):
emit_signal("cmd_invalid_argcount", command, sender_data, cmd_data, arg_ary) var user_perm_flags = get_perm_flag_from_tags(sender_data.tags)
print_debug("Invalid argcount!") if(user_perm_flags & cmd_data.permission_level != cmd_data.permission_level):
return
if(cmd_data[1] != 0):
var user_perm_flags = get_perm_flag_from_tags(sender_data[2])
if(user_perm_flags & cmd_data[1] != cmd_data[1]):
emit_signal("cmd_no_permission", command, sender_data, cmd_data, arg_ary) emit_signal("cmd_no_permission", command, sender_data, cmd_data, arg_ary)
print_debug("No Permission for command!") print_debug("No Permission for command!")
return return
if(arg_ary.size() == 0): if(arg_ary.size() == 0):
cmd_data[0].call_func([sender_data, command, whisper]) cmd_data.func_ref.call_func([sender_data, command, whisper])
else: else:
cmd_data[0].call_func([sender_data, command, whisper], arg_ary) cmd_data.func_ref.call_func([sender_data, command, whisper], arg_ary)
func get_perm_flag_from_tags(tags : Dictionary) -> int: func get_perm_flag_from_tags(tags : Dictionary) -> int:
var flag = 0 var flag = 0
var entry = tags.get("badges") var entry = tags.get("badges")
if(entry): if(entry):
if(entry.has("vip/1")): for badge in entry:
flag += PermissionFlag.VIP if(badge.begins_with("vip")):
if(entry.has("broadcaster/1")): flag += PermissionFlag.VIP
flag += PermissionFlag.STREAMER if(badge.begins_with("broadcaster")):
flag += PermissionFlag.STREAMER
entry = tags.get("mod") entry = tags.get("mod")
if(entry): if(entry):
if(entry[0] == "1"): if(entry[0] == "1"):

View File

@ -0,0 +1,16 @@
extends Reference
class_name CommandData
var func_ref : FuncRef
var permission_level : int
var max_args : int
var min_args : int
var where : int
func _init(f_ref : FuncRef, perm_lvl : int, mx_args : int, mn_args : int, whr : int):
func_ref = f_ref
permission_level = perm_lvl
max_args = mx_args
min_args = mn_args
where = whr

View File

@ -0,0 +1,11 @@
extends Reference
class_name SenderData
var user : String
var channel : String
var tags : Dictionary
func _init(usr : String, ch : String, tag_dict : Dictionary):
user = usr
channel = ch
tags = tag_dict

View File

@ -9,13 +9,25 @@
config_version=4 config_version=4
_global_script_classes=[ { _global_script_classes=[ {
"base": "Reference",
"class": "CommandData",
"language": "GDScript",
"path": "res://addons/gift/util/cmd_data.gd"
}, {
"base": "Node", "base": "Node",
"class": "Gift", "class": "Gift",
"language": "GDScript", "language": "GDScript",
"path": "res://addons/gift/gift_node.gd" "path": "res://addons/gift/gift_node.gd"
}, {
"base": "Reference",
"class": "SenderData",
"language": "GDScript",
"path": "res://addons/gift/util/sender_data.gd"
} ] } ]
_global_script_class_icons={ _global_script_class_icons={
"Gift": "" "CommandData": "",
"Gift": "",
"SenderData": ""
} }
[application] [application]