diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/blist/blist.lua')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/blist/blist.lua | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/blist/blist.lua b/Data/BuiltIn/Libraries/lua-addons/addons/blist/blist.lua new file mode 100644 index 0000000..509d6c1 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/blist/blist.lua @@ -0,0 +1,317 @@ +--[[ +Copyright (c) 2013, Ikonic +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 Blist 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 IKONIC 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 = 'Blist' +_addon.author = 'Ragnarok.Ikonic' +_addon.version = '1.2.0.1' + +require 'tables' +require 'strings' +require 'chat/colors' +local config = require 'config' +require 'logger' + +local defaults = T{} +defaults.useblist = true +defaults.linkshell = true +defaults.party = true +defaults.tell = true +defaults.emote = true +defaults.say = true +defaults.shout = true +defaults.bazaar = true +defaults.examine = true +defaults.mutedcolor = 57 + +settings = T{} +members = T{} + +windower.register_event('load',function() + settings = config.load(defaults) + members = config.load("data/members.xml",members) + windower.send_command('alias blist lua command blist') + windower.send_command('alias bl lua command blist') + windower.add_to_chat(55, "Loading ".._addon.name.." v".._addon.version.." (written by ".._addon.author..")") + windower.add_to_chat(160,' Type '..string.color('//blist help',204,160)..' for a list of possible commands.') +end) + +windower.register_event('unload',function() + windower.send_command('unalias blist') + windower.send_command('unalias bl') + windower.add_to_chat(55, "Unloading ".._addon.name.." v".._addon.version..".") +end) + +windower.register_event('login',function (name) + settings = config.load(defaults) + windower.add_to_chat(160,"Loading "..string.color(_addon.name,55,160).." settings for "..windower.ffxi.get_player().name..".") +end) + +function addon_command(...) + local args = {...} + local dummysettings = table.copy(settings) + if args[1] ~= nil then + comm = args[1]:lower() + if comm == 'help' then + windower.add_to_chat(55,_addon.name.." v".._addon.version..' possible commands:') + windower.add_to_chat(160,' '..string.color('//Blist',204,160)..' and '..string.color('//bl',204,160)..' are both valid commands.') + windower.add_to_chat(160,' '..string.color('//bl help',204,160)..' : Lists this menu.') + windower.add_to_chat(160,' '..string.color('//bl status',204,160)..' : Shows current configuration.') + windower.add_to_chat(160,' '..string.color('//bl list',204,160)..' : Displays blacklist.') + windower.add_to_chat(160,' '..string.color('//bl useblist|linkshell|party|tell|emote|say|shout|bazaar|examine',204,160)..' : Toggles using '.._addon.name..' for said chat mode.') + windower.add_to_chat(160,' '..string.color('//bl mutedcolor #',204,160)..' : Sets color for muted communication. Valid values 1-255.') + windower.add_to_chat(160,' '..string.color('//bl add|update name # hidetype reason',204,160)..' : Adds to or updates a user on your blist.') + windower.add_to_chat(160,' '..string.color(' name',204,160)..' = name of person you want to blist') + windower.add_to_chat(160,' '..string.color(' #',204,160)..' = number of days to blist said person; 0 = forever') + windower.add_to_chat(160,' '..string.color(' hidetype',204,160)..' = how blacklisted you want said person to be; valid options: hard, soft, muted') + windower.add_to_chat(160,' '..string.color(' hard',204,160)..' = full blist, nothing gets through') + windower.add_to_chat(160,' '..string.color(' soft',204,160)..' = message saying conversation from name was blocked') + windower.add_to_chat(160,' '..string.color(' muted',204,160)..' = message comes through, but in a different color') + windower.add_to_chat(160,' '..string.color(' reason',204,160)..' = reason why you are adding said person to blist') + windower.add_to_chat(160,' '..string.color('//bl delete|remove name',204,160)..' : Removes a user from your blist.') + windower.add_to_chat(160,' '..string.color('//bl qa name [reason]',204,160)..' : Adds a user to your blist w/o requiring extra details (reason is optional).') + elseif comm == 'status' then + showStatus() + elseif comm == 'list' then + windower.add_to_chat(160,string.color("Name",56).." | ".. + string.color("TempTime",3).." | ".. + string.color("HideType",settings.mutedcolor).." | ".. + string.color("Reason",59).." | ".. + string.color("Date Added",29)) + for i,v in pairs(members) do + if members[i].hidetype ~= "delete" then + windower.add_to_chat(160,string.color(tostring(i),56) .. " | " .. + string.color(tostring(members[i].temptime),3) .. " | " .. + string.color(tostring(members[i].hidetype),settings.mutedcolor) .. " | " .. + string.color(tostring(members[i].reason),59) .. " | " .. + string.color(tostring(members[i].date),29) + ) + end + end + elseif comm == "add" or comm == "update" then + if type(args[2]:match("(%a+)")) ~= "string" + or type(tonumber(args[3]:match("(%d+)"))) ~= "number" + or S({'hard','soft','muted'}):contains(args[4]:lower()) ~= true + then + windower.add_to_chat(160,"Invalid format; use the following: "..string.color("//bl "..comm.." name temptime hidetype reason",204,160)) + else + com2 = args[2] -- name + com3 = tonumber(args[3]) -- temptime + com4 = args[4]:lower() -- hidetype + if args[5] ~= nil then + com5 = table.slice(args,5) + com5mess = tostring(table.sconcat(com5)) + else + com5mess = nil + end + + local addTemp = T{} + addTemp[com2] = {} + addTemp[com2].reason = com5mess + addTemp[com2].date = os.date("%x", date) + addTemp[com2].temptime = com3 + addTemp[com2].hidetype = com4 + + members = members:update(addTemp) + members:save('all') + windower.send_ipc_message("blist reload members") + windower.add_to_chat(160,"Updating "..string.color(args[2],56,160).." entry on "..string.color(_addon.name,55,160)..".") + end + elseif comm == "qa" then + if type(args[2]:match("(%a+)")) ~= "string" then + windower.add_to_chat(160,"Invalid format; use the following: "..string.color("//bl qa <name> %[reason%]",204,160)) + else + com2 = args[2] -- name + if args[3] ~= nil then + com3 = table.slice(args,3) + com3mess = tostring(table.sconcat(com3)) + else + com3mess = nil + end + + local addTemp = T{} + addTemp[com2] = {} + addTemp[com2].reason = com3mess + addTemp[com2].date = os.date("%x", date) + addTemp[com2].temptime = 0 + addTemp[com2].hidetype = "hard" + + members = members:update(addTemp) + members:save('all') + windower.send_ipc_message("blist reload members") + windower.add_to_chat(160,"Updating "..string.color(string.ucfirst(args[2]),56,160).." entry on "..string.color(_addon.name,55,160)..".") + end + elseif comm == "remove" or comm == "delete" then + if members[args[2]] ~= nil then + windower.add_to_chat(160,"Removing "..string.color(args[2],56,160).." from "..string.color(_addon.name,55,160)..".") + members[args[2]].hidetype = "delete" + members:save('all') + windower.send_ipc_message("blist reload members") + else + windower.add_to_chat(160,"User "..string.color(args[2],56,160).." not in "..string.color(_addon.name,55,160).." database; cannot remove.") + end + elseif comm == "mutedcolor" or comm == "color" then + com2num = tonumber(args[2]) + if (com2num ~= nil) and (com2num >= 1 and com2num <= 255) then + settings[comm] = com2num + else + settings[comm] = defaults[comm] + windower.add_to_chat(160," Invalid "..string.color(comm,settings.mutedcolor,160).." value; acceptable values: 1-255. Setting default.") + end + showStatus(comm) + if tostring(com2num) ~= tostring(dummysettings[comm]) then + settings:save() -- current character only + windower.add_to_chat(55,"Saving "..string.color(_addon.name,204,55).." settings.") + end + elseif S({'useblist','linkshell','party','tell','emote','say','shout','bazaar','examine'}):contains(comm) then + settings[comm] = not settings[comm] + showStatus(comm) + if tostring(com2) ~= tostring(dummysettings[comm]) then + settings:save() -- current character only + windower.add_to_chat(55,"Saving "..string.color(_addon.name,204,55).." settings.") + end + + elseif comm == "settings" then + settings:vprint() + + else + windower.add_to_chat(160, " Not a valid ".._addon.name.." v".._addon.version.." command. "..string.color('//bl help',204,160).." for a list of valid commands.") + return + end + else + addon_command('help') + end +end + +windower.register_event('addon command',addon_command) + +function showStatus(var) + if var == "mutedcolor" then + windower.add_to_chat(160," Muted"..string.color("Color",settings.mutedcolor,160)..": " .. string.color(tostring(settings.mutedcolor),204,160)) + elseif var == "useblist" then + windower.add_to_chat(160," UseBlist: " .. string.color(onOffPrint(settings[var]),204,160)) + elseif var ~= nul then + windower.add_to_chat(160," UseBlistOn"..var:ucfirst()..": " .. string.color(onOffPrint(settings[var]),204,160)) + else + windower.add_to_chat(160," UseBlist: " .. string.color(onOffPrint(settings.useblist),204,160)) + windower.add_to_chat(160," UseBlistOnLinkshell: " .. string.color(onOffPrint(settings.linkshell),204,160)) + windower.add_to_chat(160," UseBlistOnParty: " .. string.color(onOffPrint(settings.party),204,160)) + windower.add_to_chat(160," UseBlistOnTell: " .. string.color(onOffPrint(settings.tell),204,160)) + windower.add_to_chat(160," UseBlistOnEmote: " .. string.color(onOffPrint(settings.emote),204,160)) + windower.add_to_chat(160," UseBlistOnSay: " .. string.color(onOffPrint(settings.say),204,160)) + windower.add_to_chat(160," UseBlistOnShout: " .. string.color(onOffPrint(settings.shout),204,160)) + windower.add_to_chat(160," UseBlistOnBazaar: " .. string.color(onOffPrint(settings.bazaar),204,160)) + windower.add_to_chat(160," UseBlistOnExamine: " .. string.color(onOffPrint(settings.examine),204,160)) + windower.add_to_chat(160," Muted"..string.color("Color",settings.mutedcolor,160)..": " .. string.color(tostring(settings.mutedcolor),204,160)) + end +end + +function onOffPrint(bleh) + if (bleh ~= nul) then + if (bleh == 1) or (bleh == true) then + bleh = "ON"; + else + bleh = "OFF"; + end + else + bleh = "OFF"; + end + return bleh; +end + +windower.register_event('ipc message',function (msg) + if msg == "blist reload members" then + members = config.load("data/members.xml",members) +-- windower.add_to_chat(160, "Reloading members database.") + end +end) + +windower.register_event('incoming text',function (original, modified, mode) + if settings.useblist == true then + name = "blist" + if mode == 14 and settings.linkshell == true then -- linkshell (others) + a,z,name = string.find(original,'<(%a+)> ') + elseif mode == 13 and settings.party == true then -- party (others) + a,z,name = string.find(original,'%((%a+)%) ') + elseif mode == 12 and settings.tell == true then -- tell (in) + a,z,name = string.find(original,'(%a+)>> ') + elseif (mode == 15 or mode == 7) and settings.emote == true then -- emote + a,z,name = string.find(original,'(%a+) ') + elseif mode == 1 and settings.say == true then -- say + a,z,name = string.find(original,'(%a+) ') + elseif mode == 2 and settings.shout == true then -- shout + a,z,name = string.find(original,'(%a+) ') + elseif mode == 121 and settings.bazaar == true then -- bazaar + a,z,name,filler = string.find(original,'(%a+) (.*) bazaar%.') + elseif mode == 208 and settings.examine == true then -- examine + a,z,name = string.find(original,'(%a+) examines you%.') + else + name = "blist" + end + if name ~= nil then + name = name:lower() + else + name = "blist" + end + + if name ~= "blist" and + name ~= nil and + members[name] ~= nil and + members[name].hidetype ~= "delete" then + local pattern = "(%d+)%/(%d+)%/(%d+)" + local xmonth, xday, xyear = members[name].date:match(pattern) + local blah = tonumber(members[name].temptime) + if #xyear < 4 then + xyear = tonumber("20"..tostring(xyear)) + end + local convertedT = os.time({year = xyear, month = xmonth, day = xday+blah}) + local nowTime = os.time() + if nowTime > convertedT and members[name].temptime ~= 0 then + members[name].hidetype = "delete" + members:save('all') + windower.send_ipc_message("blist reload members") + end + + if members[name].hidetype == "delete" then + modified = original + elseif members[name].hidetype == "hard" or #members[name].hidetype == 0 then + modified = '' + elseif members[name].hidetype == "soft" then + modified = _addon.name.." blocked message from "..string.ucfirst(name).."." + elseif members[name].hidetype == "muted" then + modified = string.color(original:trim(),settings.mutedcolor) + else + members[name].hidetype = "hard" + members:save('all') + windower.send_ipc_message("blist reload members") + modified = '' + end + end + return modified + end +end) |