summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/Lookup
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/Lookup')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/Lookup/Lookup.lua248
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/Lookup/README.md147
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).