summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-11-15 13:53:59 +0800
committerchai <chaifix@163.com>2021-11-15 13:53:59 +0800
commit942a030afd348ab2e02eac8054b43e3c3a72ea48 (patch)
treea13459f39a3d2f1b533fbd1b5ab523d7a621f673 /Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua
parente307051a56a54c27f10438fd2025edf61d0dfeed (diff)
*rename
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua248
1 files changed, 248 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua b/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua
new file mode 100644
index 0000000..499f2a6
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua
@@ -0,0 +1,248 @@
+--[[
+ Copyright © 2018, Karuberu
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Lookup nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+]]
+_addon.name = 'Lookup'
+_addon.author = 'Karuberu'
+_addon.version = '1.0'
+_addon.commands = {'lookup', 'lu'}
+
+config = require('config')
+res = require('resources')
+
+settings = nil
+ids = nil
+last_item = nil
+
+function load_settings()
+ settings = config.load({
+ default = 'ffxiclopedia';
+ sites = {
+ ffxiclopedia = {
+ search = 'https://ffxiclopedia.fandom.com/wiki/Special:Search?query=${term}';
+ };
+ ['bg-wiki'] = {
+ search = 'https://www.bg-wiki.com/bg/Special:Search?go=Go&search=${term}';
+ };
+ ffxidb = {
+ item = 'http://www.ffxidb.com/items/${term}';
+ zone = 'http://www.ffxidb.com/zones/${term}';
+ search = 'http://www.ffxidb.com/search?q=${term}';
+ };
+ ffxiah = {
+ item = 'http://www.ffxiah.com/item/${term}';
+ search = 'http://www.ffxiah.com/search/item?q=${term}';
+ };
+ ffxiahplayer = {
+ search = 'https://www.ffxiah.com/search/player?name=${term}';
+ };
+ google = {
+ search = 'https://www.google.com/search?q=${term}';
+ };
+ ffxi = { redirect = 'ffxiclopedia'; };
+ wikia = { redirect = 'ffxiclopedia'; };
+ bgwiki = { redirect = 'bg-wiki'; };
+ bg = { redirect = 'bg-wiki'; };
+ db = { redirect = 'ffxidb'; };
+ ah = { redirect = 'ffxiah'; };
+ ffxiahp = { redirect = 'ffxiahplayer'; };
+ ahp = { redirect = 'ffxiahplayer'; };
+ };
+ })
+end
+
+-- Creates a list of item and zone ids by name for quicker lookup by name
+function initialize_ids()
+ ids = {
+ items = {};
+ zones = {};
+ }
+ for item in res.items:it() do
+ ids.items[item.name] = item.id
+ ids.items[item.name_log] = item.id
+ end
+ for zone in res.zones:it() do
+ ids.zones[zone.name] = zone.id
+ end
+end
+
+function get_id(name)
+ if id == nil then
+ return {}
+ end
+ return {
+ item = ids.items[name];
+ zone = ids.zones[name];
+ }
+end
+
+function get_name(id, list)
+ if id == nil then
+ return nil
+ end
+ return (list[id] or {}).name
+end
+
+-- Converts auto-translate strings to plain text.
+-- If the string is not an auto-translate string, the original string is returned.
+function translate(str)
+ return windower.convert_auto_trans(str)
+end
+
+-- Checks to see if the string is a selector (enclosed by <>) and returns a replacement.
+-- If the string is not a selector, the original string is returned.
+function parse_selection(str)
+ local target = str:match('<(.+)>')
+ if target == nil then
+ return str
+ end
+
+ -- custom selection handlers
+ if target == 'job' or target == 'mjob' then
+ return windower.ffxi.get_player().main_job_full
+ elseif target == 'sjob' then
+ return windower.ffxi.get_player().sub_job_full
+ elseif target == 'zone' then
+ if windower.ffxi.get_info().mog_house then
+ return 'Mog House'
+ else
+ return get_name(windower.ffxi.get_info().zone, res.zones)
+ end
+ elseif target == 'item' then
+ return get_name(last_item, res.items)
+ end
+ -- default to windower's selection handlers
+ return (windower.ffxi.get_mob_by_target(str) or {}).name
+end
+
+function set_default_site(command_modifier, site)
+ settings.default = site
+ if command_modifier == 'player' or command_modifier == 'p' then
+ -- save only for the current character
+ settings:save()
+ else
+ -- save for all characters
+ settings:save('all')
+ end
+end
+
+function modify_site_settings(site, type, url)
+ if url == 'remove' then
+ url = nil
+ end
+ settings.sites[site][type] = url
+end
+
+function set_last_item(bag, index, id, count)
+ if bag == 0 then
+ last_item = id
+ end
+end
+
+-- Replaces the named parameters in the url
+function format_url(url, term)
+ if term == nil then
+ return term
+ end
+ return url:gsub('${term}', '%s':format(term))
+end
+
+function get_site(command)
+ local site = settings.sites[command]
+ if site ~= nil and site.redirect ~= nil then
+ site = settings.sites[site.redirect]
+ end
+ return site
+end
+
+function get_url(site, term)
+ term = translate(term)
+ term = parse_selection(term)
+ local id = get_id(term)
+ if id.item ~= nil and site.item ~= nil then
+ url = format_url(site.item, id.item)
+ elseif id.zone ~= nil and site.zone ~= nil then
+ url = format_url(site.zone, id.zone)
+ else
+ url = format_url(site.search, term)
+ end
+ return url
+end
+
+function process_command(...)
+ -- get the first argument and set it as the command for now
+ local command = ({...}[1] or ''):lower()
+
+ if command == 'default' then
+ local command_modifier, default_site
+ if {...}[3] ~= nil then
+ -- if there are three or more arguments, the second one is the modifier
+ command_modifier = {...}[2]
+ default_site = {...}[3]
+ else
+ default_site = {...}[2]
+ end
+ set_default_site(command_modifier, default_site)
+ return
+ elseif command == 'site' then
+ local site = {...}[2]
+ local type = {...}[3]
+ local url = {...}[4]
+ modify_site_settings(site, type, url)
+ return
+ end
+
+ local term;
+ if {...}[2] ~= nil then
+ -- if there are two arguments, the first is the command and the second the term
+ command = {...}[1]
+ term = {...}[2]
+ else
+ -- otherwise, just a term is provided, so use the default command
+ command = settings.default
+ term = {...}[1]
+ end
+ if term == nil then
+ return
+ end
+
+ local site = get_site(command:lower())
+ if site == nil then
+ return
+ end
+
+ local url = get_url(site, term)
+ if url == nil then
+ return
+ end
+ windower.open_url(url)
+end
+
+load_settings()
+initialize_ids()
+
+windower.register_event('add item', set_last_item)
+windower.register_event('addon command', process_command)