diff options
author | chai <chaifix@163.com> | 2021-11-15 13:53:59 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-11-15 13:53:59 +0800 |
commit | 942a030afd348ab2e02eac8054b43e3c3a72ea48 (patch) | |
tree | a13459f39a3d2f1b533fbd1b5ab523d7a621f673 /Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua | |
parent | e307051a56a54c27f10438fd2025edf61d0dfeed (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.lua | 248 |
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) |