From f5d688331590966829bca375d1fd012ab0df2876 Mon Sep 17 00:00:00 2001 From: Enrico Horn Date: Thu, 14 May 2020 00:28:08 +0200 Subject: [PATCH 1/3] findall: Search for duplicates --- README.md | 1 + findall.lua | 51 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 80f4064..d6aaabb 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ findall [: [:...]] [-e|--export=] * `character1`: the name of the characters to use for the search. * `...`: variable list of character names. * `query` the word you are looking for. +* `-d` or `--duplicates` to list only items which are found in more than one container * `-e` or `--export=` exports the results to a csv file. The file will be created in the data folder. Looks for any item whose name (long or short) contains the specified value on the specified characters. diff --git a/findall.lua b/findall.lua index f2942d8..4cb05c3 100644 --- a/findall.lua +++ b/findall.lua @@ -79,6 +79,7 @@ function error(method, message) print('ERR(' .. method .. '): ' .. message) end + function encase_key(key) if type(key) == 'number' then return '[' .. tostring(key) .. ']' @@ -258,6 +259,7 @@ function print_help() { ' [: [:...]]', '- the names of the characters to use for the search.' }, { ' [! [!...]]', '- the names of the characters to exclude from the search.' }, { ' []', '- the word you are looking for.' }, + { ' [-d|--duplicates]', '- list only items which are found in more than one container.' }, { ' [-e|--export=]', '- exports the results to a csv file in the data folder.' }, } local examples = { @@ -312,6 +314,7 @@ function determine_query_elements(searchparams) local char_exclude = {} local search_terms = {} local export = nil + local duplicates = false for _, query_element in pairs(searchparams) do -- character specifiers must start with a '!' or a ':' @@ -336,12 +339,14 @@ function determine_query_elements(searchparams) error('determine_query_elements', 'The filename cannot contain any of the following characters: \\ / : * ? " < > |') end end + elseif string.match(query_element, '^--duplicates$') or string.match(query_element, '^-d$') then + duplicates = true else table.insert(search_terms, query_element) end end - return char_include, char_exclude, table.concat(search_terms,' '), export + return char_include, char_exclude, table.concat(search_terms,' '), export, duplicates end @@ -389,7 +394,34 @@ function search(char_include, char_exclude, terms) end -function display_search_results(result, from_all_chars, terms) +function filter_duplicates(search_result) + for char_name, storage_list in pairs(search_result) do + storage_list[KEY_ITEM_STORAGE_NAME] = nil + end + + local counts_by_itemid = {} + for char_name, storage_list in pairs(search_result) do + for storage_name, item_list in pairs(storage_list) do + for item_id, quantity in pairs(item_list) do + counts_by_itemid[item_id] = (counts_by_itemid[item_id] or 0) + 1 + end + end + end + + for char_name, storage_list in pairs(search_result) do + for storage_name, item_list in pairs(storage_list) do + for item_id, quantity in pairs(item_list) do + if counts_by_itemid[item_id] == 1 then + item_list[item_id] = nil + end + end + end + end + return search_result +end + + +function display_search_results(result, from_all_chars, terms, duplicates) local terms_pattern = build_search_pattern(terms) local total_quantity = 0 @@ -403,7 +435,7 @@ function display_search_results(result, from_all_chars, terms) total_quantity = total_quantity + quantity end - local prefix = '\30\03' .. char_name .. '/' .. storage_name .. ':\30\01 ' + local prefix = '\30\03' .. char_name .. '/' .. storage_name .. '\30\01' local suffix = (quantity > 1 and ' \30\03' .. '(' .. quantity .. ')\30\01' or '') local item_name @@ -417,7 +449,11 @@ function display_search_results(result, from_all_chars, terms) else item_name = names.name end - table.insert(results, prefix .. item_name .. suffix) + if duplicates then + table.insert(results, item_name .. ': ' .. prefix .. suffix) + else + table.insert(results, prefix .. '\30\03: \30\01' .. item_name .. suffix) + end end end end @@ -472,10 +508,13 @@ end function handle_command(args) - local char_include, char_exclude, terms, export = determine_query_elements(args) + local char_include, char_exclude, terms, export, duplicates = determine_query_elements(args) local result = search(char_include, char_exclude, terms) + if duplicates then + result = filter_duplicates(result) + end local all_chars = #char_include == 0 and #char_exclude == 0 - display_search_results(result, all_chars, terms) + display_search_results(result, all_chars, terms, duplicates) if export ~=nil then export_to_file(result, export) end -- 2.41.0.windows.1 From e4a3b88a749b2f1e05b1f44114f0fc288ab9001f Mon Sep 17 00:00:00 2001 From: Enrico Horn Date: Thu, 14 May 2020 22:25:15 +0200 Subject: [PATCH 2/3] findall: Search for stackables --- README.md | 1 + findall.lua | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6aaabb..ce68123 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ findall [: [:...]] [-e|--export=] * `query` the word you are looking for. * `-d` or `--duplicates` to list only items which are found in more than one container * `-e` or `--export=` exports the results to a csv file. The file will be created in the data folder. +* `-s` or `--stackables` to list only items which can stack Looks for any item whose name (long or short) contains the specified value on the specified characters. diff --git a/findall.lua b/findall.lua index 4cb05c3..201c64d 100644 --- a/findall.lua +++ b/findall.lua @@ -261,6 +261,7 @@ function print_help() { ' []', '- the word you are looking for.' }, { ' [-d|--duplicates]', '- list only items which are found in more than one container.' }, { ' [-e|--export=]', '- exports the results to a csv file in the data folder.' }, + { ' [-s|--stackables]', '- list only items which can stack.' }, } local examples = { { '/findall thaumas', '- Search for "thaumas" on all your characters.' }, @@ -315,6 +316,7 @@ function determine_query_elements(searchparams) local search_terms = {} local export = nil local duplicates = false + local stackables = false for _, query_element in pairs(searchparams) do -- character specifiers must start with a '!' or a ':' @@ -341,12 +343,14 @@ function determine_query_elements(searchparams) end elseif string.match(query_element, '^--duplicates$') or string.match(query_element, '^-d$') then duplicates = true + elseif string.match(query_element, '^--stackables') or string.match(query_element, '^-s$') then + stackables = true else table.insert(search_terms, query_element) end end - return char_include, char_exclude, table.concat(search_terms,' '), export, duplicates + return char_include, char_exclude, table.concat(search_terms,' '), export, duplicates, stackables end @@ -421,6 +425,25 @@ function filter_duplicates(search_result) end +function filter_stackables(search_result) + for char_name, storage_list in pairs(search_result) do + storage_list[KEY_ITEM_STORAGE_NAME] = nil + end + + for char_name, storage_list in pairs(search_result) do + for storage_name, item_list in pairs(storage_list) do + for item_id, quantity in pairs(item_list) do + local item = AshitaCore:GetResourceManager():GetItemById(item_id); + if not item or item.StackSize <= 1 then + item_list[item_id] = nil + end + end + end + end + return search_result +end + + function display_search_results(result, from_all_chars, terms, duplicates) local terms_pattern = build_search_pattern(terms) @@ -508,11 +531,14 @@ end function handle_command(args) - local char_include, char_exclude, terms, export, duplicates = determine_query_elements(args) + local char_include, char_exclude, terms, export, duplicates, stackables = determine_query_elements(args) local result = search(char_include, char_exclude, terms) if duplicates then result = filter_duplicates(result) end + if stackables then + result = filter_stackables(result) + end local all_chars = #char_include == 0 and #char_exclude == 0 display_search_results(result, all_chars, terms, duplicates) if export ~=nil then -- 2.41.0.windows.1 From 05d114b2204f8095af9b98f3bdf75437b39816f9 Mon Sep 17 00:00:00 2001 From: Enrico Horn Date: Thu, 14 May 2020 22:27:09 +0200 Subject: [PATCH 3/3] findall: Set version to 2.0 --- findall.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/findall.lua b/findall.lua index 201c64d..f5f61b8 100644 --- a/findall.lua +++ b/findall.lua @@ -27,8 +27,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ]] _addon.name = 'findAll' -_addon.author = 'Zohno (ported by farmboy0)' -_addon.version = '1.20170501' +_addon.author = 'Zohno (ported and extended by farmboy0)' +_addon.version = '2.0' require 'ffxi.enums' require 'tableex' -- 2.41.0.windows.1