From a724498d83a99c67301600b2f63481a7af30ea9a Mon Sep 17 00:00:00 2001 From: lili-ffxi <40600148+lili-ffxi@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:17:28 +0100 Subject: [PATCH 1/4] Update send.lua Initial refactoring by Arcon --- addons/send/send.lua | 136 +++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 82 deletions(-) diff --git a/addons/send/send.lua b/addons/send/send.lua index 65c53f0ca..86ef2e578 100644 --- a/addons/send/send.lua +++ b/addons/send/send.lua @@ -5,60 +5,59 @@ _addon.author = 'Byrth, Lili' local debug = false +require('functions') require('chat') -windower.register_event('addon command', function (...) - if ...:lower() == '@debug' then +windower.register_event('addon command', function(target, ...) + if not target then + error('No target provided.') + return + end + + if not ... then + error('No command provided.') + return + end + + target = target:lower() + + if target == '@debug' then debug = not debug windower.add_to_chat(55, 'send: debug ' .. tostring(debug)) return end - local term = T{...}:map(function(str) - str = windower.convert_auto_trans(str):strip_format() - if str:find(' ', string.encoding.shift_jis) then - return str:enclose('"') - end - return str + local command = T{...}:map(strip_format .. windower.convert_auto_trans):map(function(str) + return str:find(' ', string.encoding.shift_jis) and str:enclose('"') or str end):sconcat():gsub('<(%a+)id>', function(target_string) local entity = windower.ffxi.get_mob_by_target(target_string) return entity and entity.id or '<' .. target_string .. 'id>' end) if debug then - windower.add_to_chat(207, 'send (debug): '..term) + windower.add_to_chat(207, 'send (debug): ' .. command) end - local broken_init = split(term, ' ') - local qual = table.remove(broken_init, 1):lower() local player = windower.ffxi.get_player() - if #broken_init < 1 then - return - end - - if player and qual == player['name']:lower() then - relevant_msg(table.concat(broken_init, ' ')) + if player and target == player['name']:lower() then + execute_command(command) return - elseif qual == '@all' or qual == '@'..player.main_job:lower() then - if player then - relevant_msg(table.concat(broken_init, ' ')) - end - elseif qual:startswith('@party') then + elseif player and target == '@all' or target == '@'..player.main_job:lower() then + execute_command(command) + elseif target == '@party' then if player then - relevant_msg(table.concat(broken_init, ' ')) + execute_command(command) end - local qual = qual .. windower.ffxi.get_player().name - term = qual .. ' ' .. table.concat(broken_init, ' ') - elseif qual:startswith('@zone') then + command = target .. player.name .. ' ' .. command + elseif target == '@zone' then if player then - relevant_msg(table.concat(broken_init, ' ')) + execute_command(command) end - local qual = qual .. windower.ffxi.get_info().zone - term = qual .. ' ' .. table.concat(broken_init, ' ') + command = target .. windower.ffxi.get_info().zone .. ' ' .. command end - windower.send_ipc_message('send ' .. term) + windower.send_ipc_message('send ' .. command) end) windower.register_event('ipc message', function (msg) @@ -66,74 +65,47 @@ windower.register_event('ipc message', function (msg) windower.add_to_chat(207, 'send receive (debug): ' .. msg) end - local broken = split(msg, ' ') - local command = table.remove(broken, 1) - - if command ~= 'send' or #broken < 2 then + local info = windower.ffxi.get_info() + if not info.logged_in then return end - local qual = table.remove(broken, 1) - local player = windower.ffxi.get_player() - if not player then + local split = msg:split(' ', string.encoding.shift_jis, 3) + if #split < 3 or split[1] ~= 'send' then return end - if qual:lower() == player.name:lower() then - relevant_msg(table.concat(broken, ' ')) - elseif string.char(qual:byte(1)) == '@' then - local arg = string.char(qual:byte(2, qual:len())):upper() + local target = split[2] + local command = split[3] + + local player = windower.ffxi.get_player() + + if target:lower() == player.name:lower() then + execute_command(command) + elseif target:startswith('@') then + local arg = target:sub(2):lower() - if arg == player.main_job:upper() or arg == 'ALL' or arg == 'OTHERS' then - relevant_msg(table.concat(broken, ' ')) - elseif arg:startswith('PARTY') then + if arg == player.main_job:upper() or arg == 'all' or arg == 'others' then + execute_command(command) + elseif arg:startswith('party') then local name = arg:sub(6, #arg):lower() local party = windower.ffxi.get_party() - local sameparty = function() - for i=1, 5 do - local idx = 'p'..i - if party[idx] and party[idx].name:lower() == name then - return true - end + for i = 1, 5 do + local idx = 'p'..i + if party[idx] and party[idx].name:lower() == name then + execute_command(command) + return end - end() - - if sameparty then - relevant_msg(table.concat(broken, ' ')) end - elseif arg:upper():startswith('ZONE') then - local samezone = tonumber(arg:sub(5, #arg)) == windower.ffxi.get_info().zone - - if samezone then - relevant_msg(table.concat(broken, ' ')) + elseif arg:startswith('zone') then + if tonumber(arg:sub(5)) == info.zone then + execute_command(command) end end end end) -function split(msg, match) - if msg == nil then return '' end - local length = msg:len() - local splitarr = {} - local u = 1 - while u <= length do - local nextanch = msg:find(match, string.encoding.shift_jis, u) - if nextanch ~= nil then - splitarr[#splitarr + 1] = msg:sub(u, nextanch - match:len()) - if nextanch ~= length then - u = nextanch + match:len() - else - u = length - end - else - splitarr[#splitarr + 1] = msg:sub(u, length) - u = length + 1 - end - end - return splitarr -end - -function relevant_msg(msg) +function execute_command(msg) if msg:sub(1, 2) == '//' then windower.send_command(msg:sub(3)) elseif msg:sub(1, 1) == '/' then From db177ad6da35d9671bf5fef8b883a697858046f9 Mon Sep 17 00:00:00 2001 From: lili-ffxi <40600148+lili-ffxi@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:20:58 +0100 Subject: [PATCH 2/4] Update send.lua Tentative fix for a couple quirks caused by splitting the `target` arg off `...` --- addons/send/send.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/send/send.lua b/addons/send/send.lua index 86ef2e578..3cd3b3f74 100644 --- a/addons/send/send.lua +++ b/addons/send/send.lua @@ -14,11 +14,6 @@ windower.register_event('addon command', function(target, ...) return end - if not ... then - error('No command provided.') - return - end - target = target:lower() if target == '@debug' then @@ -27,7 +22,12 @@ windower.register_event('addon command', function(target, ...) return end - local command = T{...}:map(strip_format .. windower.convert_auto_trans):map(function(str) + if not ... then + error('No command provided.') + return + end + + local command = target .. ' ' .. T{...}:map(string.strip_format .. windower.convert_auto_trans):map(function(str) return str:find(' ', string.encoding.shift_jis) and str:enclose('"') or str end):sconcat():gsub('<(%a+)id>', function(target_string) local entity = windower.ffxi.get_mob_by_target(target_string) From 78fc4296c577b9de541095c1b17073b7cd3bef5f Mon Sep 17 00:00:00 2001 From: lili-ffxi <40600148+lili-ffxi@users.noreply.github.com> Date: Fri, 5 Apr 2024 01:58:53 +0100 Subject: [PATCH 3/4] Update send.lua Added obligatory `` argument to `@debug` Moved debug prints around for simplicity Fixed bugs: - a stray `:upper()` had survived the refactoring - a `@job` target that was different from the sender main job would be lost in the void and not passed on --- addons/send/send.lua | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/addons/send/send.lua b/addons/send/send.lua index 3cd3b3f74..9b6e852ad 100644 --- a/addons/send/send.lua +++ b/addons/send/send.lua @@ -1,7 +1,7 @@ _addon.version = '1.2' _addon.name = 'Send' _addon.command = 'send' -_addon.author = 'Byrth, Lili' +_addon.author = 'Byrth, Lili, Arcon' local debug = false @@ -14,30 +14,26 @@ windower.register_event('addon command', function(target, ...) return end - target = target:lower() - - if target == '@debug' then - debug = not debug - windower.add_to_chat(55, 'send: debug ' .. tostring(debug)) - return - end - if not ... then error('No command provided.') return end - local command = target .. ' ' .. T{...}:map(string.strip_format .. windower.convert_auto_trans):map(function(str) + target = target:lower() + + if target == '@debug' then + local arg = (... == 'on' or ... == 'off') and ... or error('Invalid argument. Usage: send @debug ') + debug = arg == 'on' + return windower.add_to_chat(55, 'send: debug ' .. tostring(debug)) + end + + local command = T{...}:map(string.strip_format .. windower.convert_auto_trans):map(function(str) return str:find(' ', string.encoding.shift_jis) and str:enclose('"') or str end):sconcat():gsub('<(%a+)id>', function(target_string) local entity = windower.ffxi.get_mob_by_target(target_string) return entity and entity.id or '<' .. target_string .. 'id>' end) - if debug then - windower.add_to_chat(207, 'send (debug): ' .. command) - end - local player = windower.ffxi.get_player() if player and target == player['name']:lower() then @@ -49,15 +45,21 @@ windower.register_event('addon command', function(target, ...) if player then execute_command(command) end - command = target .. player.name .. ' ' .. command + target = target .. player.name elseif target == '@zone' then if player then execute_command(command) end - command = target .. windower.ffxi.get_info().zone .. ' ' .. command + target = target .. windower.ffxi.get_info().zone + end + + command = 'send ' .. target .. ' ' .. command + + if debug then + windower.add_to_chat(207, 'send (debug): ' .. command) end - windower.send_ipc_message('send ' .. command) + windower.send_ipc_message(command) end) windower.register_event('ipc message', function (msg) @@ -85,14 +87,14 @@ windower.register_event('ipc message', function (msg) elseif target:startswith('@') then local arg = target:sub(2):lower() - if arg == player.main_job:upper() or arg == 'all' or arg == 'others' then + if arg == player.main_job:lower() or arg == 'all' or arg == 'others' then execute_command(command) elseif arg:startswith('party') then - local name = arg:sub(6, #arg):lower() + local sender = arg:sub(6, #arg):lower() local party = windower.ffxi.get_party() for i = 1, 5 do local idx = 'p'..i - if party[idx] and party[idx].name:lower() == name then + if party[idx] and party[idx].name:lower() == sender then execute_command(command) return end From 012ea95edd6c9de6065b4b320b1a8c1f191bf41f Mon Sep 17 00:00:00 2001 From: lili-ffxi <40600148+lili-ffxi@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:27:18 +0100 Subject: [PATCH 4/4] Update send.lua --- addons/send/send.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/send/send.lua b/addons/send/send.lua index 9b6e852ad..b1ab80a41 100644 --- a/addons/send/send.lua +++ b/addons/send/send.lua @@ -1,7 +1,7 @@ _addon.version = '1.2' _addon.name = 'Send' _addon.command = 'send' -_addon.author = 'Byrth, Lili, Arcon' +_addon.author = 'Byrth, Lili' local debug = false