diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/Lookup')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua | 248 | ||||
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/Lookup/README.md | 147 |
2 files changed, 395 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) diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/README.md b/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/README.md new file mode 100644 index 0000000..d091c0e --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/Lookup/README.md @@ -0,0 +1,147 @@ +# Lookup +A simple [Windower4](http://www.windower.net/) addon that looks up search terms through in-game commands. + +The default search is performed with the following command: +``` +//lookup "Search Term" +``` +Alternatively, the shorthand `lu` can be used: +``` +//lu "Search Term" +``` + +Running this command will open up the search in your default browser. + +The search term can be plain text, auto-translate text, or one of the available [selectors](#selectors). If the search term contains a space, it must be surrounded in quotes (this does not apply to selectors). + +The default search sites are [FFXIclopedia](http://ffxiclopedia.wikia.com/), [BGWiki](http://www.bg-wiki.com), [FFXIAH](http://www.ffxiah.com), [FFXIDB](http://www.ffxidb.com), and [Google](http://www.google.com). See the [site command](#site) for how to add additional sites. + +See the [commands](#commands) section for a list of all available commands. + +## Selectors +Selectors can be used in place of plain text search terms. They are very useful for quickly getting information about something in the environment or a recently obtained item. + +The following selectors are accepted by this addon: + +| Selector | Replacement | +|----------|-------------| +| `<job>`<br>`<mjob>` | The current player's main job. | +| `<sjob>` | The current player's subjob. | +| `<zone>` | The current area/zone. | +| `<item>` | The last item placed in the player's inventory, including items moved from other bags. | + +The selectors found in [Windower's documentation](https://github.com/Windower/Lua/wiki/FFXI-Functions#windowerffxiget_mob_by_targettarget) are also accepted. Some of the more useful selectors are listed below, for convenience: + +| Selector | Replacement | +|----------|-------------| +| `<t>` | The current target's name. | +| `<bt>` | The current battle target'name . | +| `<pet>` | The name of the current player's pet. | +| `<me>` | The current player's name. | +| `<r>` | The name of the player that last sent a tell to you. | + +## Commands +``` +//lookup "Search Term" +``` +Searches for the term on the default site. The default site is set to "ffxiclopedia" initially, but can be changed with the "default" command. + +Alternatively, the shorthand `lu` can be used: +``` +//lu "Search Term" +``` + +#### Default +``` +//lookup default "site" +``` +Sets the default site to search with. Saved in the global settings (not character-specific). + +``` +//lookup default player "site" +``` +``` +//lookup default p "site" +``` +Saves the default site only for the current player. + +#### Site +``` +//lookup site "site" search "http://www.example.com/search?q=${term}" +``` +Adds or modifies the site lookup capability. + +The second argument, `"site"` is the site that you're modifying. For example, specifying `"ffxiclopedia"` would modify the settings for `ffxiclopedia` searches. New sites can also be added this way. + +The third argument, `search`, can be substituted for `zone` or `item` if the site supports zone or item ids in its url. + +The last argument is the url of the search. The `${term}` in the url will be substituted for the search term when a lookup is performed. + +``` +//lookup site "site" remove +``` +Removes all lookup capability for the specified site (`"site"`). + +``` +//lookup site "site" search remove +``` +Removes the `search` lookup capability for the specified site (`"site"`). The `search` argument can also be substituted for `zone` or `item`. + +#### FFXIclopedia +``` +//lookup ffxiclopedia "Search Term" +``` +``` +//lookup ffxi "Search Term" +``` +``` +//lookup wikia "Search Term" +``` +Searches for the term on [FFXIclopedia](http://ffxiclopedia.wikia.com/). + +#### BGWiki +``` +//lookup bg-wiki "Search Term" +``` +``` +//lookup bgwiki "Search Term" +``` +``` +//lookup bg "Search Term" +``` +Searches for the term on [BGWiki](http://www.bg-wiki.com). + +#### FFXIAH +``` +//lookup ffxiah "Item" +``` +``` +//lookup ah "Item" +``` +Searches for the item on [FFXIAH](http://www.ffxiah.com). + +``` +//lookup ffxiahplayer "Player" +``` +``` +//lookup ffxiahp "Player" +``` +``` +//lookup ahp "Player" +``` +Searches for the player on [FFXIAH](http://www.ffxiah.com). + +#### FFXIDB +``` +//lookup ffxidb "Search Term" +``` +``` +//lookup db "Search Term" +``` +Searches for the term on [FFXIDB](http://www.ffxidb.com). + +#### Google +``` +//lookup google "Search Term" +``` +Searches for the term on [Google](http://www.google.com). |