You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

425 lines
13 KiB

---------------------------------------------------------------------------------
--
-- Prat - A framework for World of Warcraft chat mods
--
-- Copyright (C) 2006-2018 Prat Development Team
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 2
-- of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to:
--
-- Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.
--
--
-------------------------------------------------------------------------------
Prat:AddModuleToLoad(function()
local PRAT_MODULE = Prat:RequestModuleName("Invites")
if PRAT_MODULE == nil then
return
end
local module = Prat:NewModule(PRAT_MODULE, "AceHook-3.0")
-- define localized strings
local PL = module.PL
--[==[@debug@
PL:AddLocale(PRAT_MODULE, "enUS", {
module_name = "Invites",
module_desc = "Options for easy inviting of players to groups",
["Enable Alt-Invite"] = true,
["Toggle group invites by alt-clicking on player name."] = true,
["Enable Invite Links"] = true,
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = true,
})
--@end-debug@]==]
-- These Localizations are auto-generated. To help with localization
-- please go to http://www.wowace.com/projects/prat-3-0/localization/
--@non-debug@
do
local L
L = {
["Invites"] = {
["Enable Alt-Invite"] = true,
["Enable Invite Links"] = true,
["module_desc"] = "Options for easy inviting of players to groups",
["module_name"] = "Invites",
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = true,
["Toggle group invites by alt-clicking on player name."] = true,
}
}
PL:AddLocale(PRAT_MODULE, "enUS",L)
L = {
["Invites"] = {
--[[Translation missing --]]
["Enable Alt-Invite"] = "Enable Alt-Invite",
["Enable Invite Links"] = "Activer les liens d'invitation",
--[[Translation missing --]]
["module_desc"] = "Options for easy inviting of players to groups",
--[[Translation missing --]]
["module_name"] = "Invites",
--[[Translation missing --]]
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Toggle group invites by alt-clicking hyperlinked keywords like 'invite'.",
--[[Translation missing --]]
["Toggle group invites by alt-clicking on player name."] = "Toggle group invites by alt-clicking on player name.",
}
}
PL:AddLocale(PRAT_MODULE, "frFR",L)
L = {
["Invites"] = {
["Enable Alt-Invite"] = "Alternative Einladung aktivieren",
["Enable Invite Links"] = "Aktiviere Einladungs-Links",
["module_desc"] = "Optionen zum einfachen Einladen von Spielern für Gruppen",
["module_name"] = "Einladungen",
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Zum Umschalten der Gruppeneinladungen, klicke bei gedrückter Alt-Taste auf Hyperlink-Schlüsselwörter wie \"einladen\".",
["Toggle group invites by alt-clicking on player name."] = "Zum Umschalten der Gruppeneinladungen, klicke bei gedrückter Alt-Taste auf den Spielernamen.",
}
}
PL:AddLocale(PRAT_MODULE, "deDE",L)
L = {
["Invites"] = {
["Enable Alt-Invite"] = "Alt-초대 켜기",
["Enable Invite Links"] = "초대 링크 켜기",
["module_desc"] = "사용자 그룹 쉽게 추가하기 옵션",
["module_name"] = "초대 [Invites]",
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "'초대'와 같은 하이퍼링크된 키워드를 클릭하여 그룹 초대를 전환합니다.",
["Toggle group invites by alt-clicking on player name."] = "플레이어 이름을 Alt-클릭하여 그룹 초대를 전환합니다.",
}
}
PL:AddLocale(PRAT_MODULE, "koKR",L)
L = {
["Invites"] = {
--[[Translation missing --]]
["Enable Alt-Invite"] = "Enable Alt-Invite",
--[[Translation missing --]]
["Enable Invite Links"] = "Enable Invite Links",
--[[Translation missing --]]
["module_desc"] = "Options for easy inviting of players to groups",
--[[Translation missing --]]
["module_name"] = "Invites",
--[[Translation missing --]]
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Toggle group invites by alt-clicking hyperlinked keywords like 'invite'.",
--[[Translation missing --]]
["Toggle group invites by alt-clicking on player name."] = "Toggle group invites by alt-clicking on player name.",
}
}
PL:AddLocale(PRAT_MODULE, "esMX",L)
L = {
["Invites"] = {
["Enable Alt-Invite"] = "включить Alt-приглашение ",
["Enable Invite Links"] = "Показать ссылку \"приглашения\" ",
["module_desc"] = "Опции простого приглашения игроков в группу ",
["module_name"] = "Приглашения ",
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = [=[Переключить группу приглашений, нажимая альт-клик по гиперссылкам, таким как «пригласить».
]=],
["Toggle group invites by alt-clicking on player name."] = [=[Переключить группу приглашений, нажав Alt на имя игрока.
]=],
}
}
PL:AddLocale(PRAT_MODULE, "ruRU",L)
L = {
["Invites"] = {
["Enable Alt-Invite"] = "启用Alt-调出",
["Enable Invite Links"] = "启用调出链接",
["module_desc"] = "便捷邀请玩家加入队伍的选项",
["module_name"] = "邀请",
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "通过按住Alt键单击超链接的关键字(如“邀请”)来切换组队邀请。",
["Toggle group invites by alt-clicking on player name."] = "通过按住Alt键点击玩家名字来切换组队邀请。",
}
}
PL:AddLocale(PRAT_MODULE, "zhCN",L)
L = {
["Invites"] = {
--[[Translation missing --]]
["Enable Alt-Invite"] = "Enable Alt-Invite",
--[[Translation missing --]]
["Enable Invite Links"] = "Enable Invite Links",
--[[Translation missing --]]
["module_desc"] = "Options for easy inviting of players to groups",
--[[Translation missing --]]
["module_name"] = "Invites",
--[[Translation missing --]]
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Toggle group invites by alt-clicking hyperlinked keywords like 'invite'.",
--[[Translation missing --]]
["Toggle group invites by alt-clicking on player name."] = "Toggle group invites by alt-clicking on player name.",
}
}
PL:AddLocale(PRAT_MODULE, "esES",L)
L = {
["Invites"] = {
--[[Translation missing --]]
["Enable Alt-Invite"] = "Enable Alt-Invite",
--[[Translation missing --]]
["Enable Invite Links"] = "Enable Invite Links",
--[[Translation missing --]]
["module_desc"] = "Options for easy inviting of players to groups",
--[[Translation missing --]]
["module_name"] = "Invites",
--[[Translation missing --]]
["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."] = "Toggle group invites by alt-clicking hyperlinked keywords like 'invite'.",
--[[Translation missing --]]
["Toggle group invites by alt-clicking on player name."] = "Toggle group invites by alt-clicking on player name.",
}
}
PL:AddLocale(PRAT_MODULE, "zhTW",L)
end
--@end-non-debug@
Prat:SetModuleOptions(module, {
name = PL.module_name,
desc = PL.module_desc,
type = "group",
args = {
altinvite = {
name = PL["Enable Alt-Invite"],
desc = PL["Toggle group invites by alt-clicking on player name."],
type = "toggle",
order = 151,
},
linkinvite = {
name = PL["Enable Invite Links"],
desc = PL["Toggle group invites by alt-clicking hyperlinked keywords like 'invite'."],
type = "toggle",
order = 152,
},
}
})
Prat:SetModuleDefaults(module.name, {
profile = {
on = true,
altinvite = true,
linkinvite = true,
}
})
function module:OnModuleEnable()
self:SetAltInvite()
Prat.RegisterLinkType({ linkid = "invplr", linkfunc = self.Invite_Link, handler = self }, self.name)
Prat.RegisterLinkType({ linkid = "player", linkfunc = self.Player_Link, handler = self }, self.name)
end
function module:OnValueChanged(info, b)
local field = info[#info]
if field == "altinvite" or field == "linkinvite" then
self:SetAltInvite()
end
end
-- This function is a wrapper for the Blizzard invite function, to account for the differences between Retail and Classic
function module:InviteUnit(...)
if Prat.IsRetail then
return C_PartyInfo.InviteUnit(...)
else
return InviteUnit(...)
end
end
-- This function is a wrapper for the Blizzard invite function, to account for the differences between Retail and Classic
function module:CanInvite(...)
if Prat.IsRetail then
return C_PartyInfo.CanInvite(...)
else
return CanGroupInvite(...)
end
end
function module:SetAltInvite()
if (self.db.profile.altinvite) then
self:SecureHook("SetItemRef")
else
self:Unhook("SetItemRef")
end
end
local EVENTS_FOR_INVITE = {
["CHAT_MSG_GUILD"] = true,
["CHAT_MSG_OFFICER"] = true,
["CHAT_MSG_PARTY"] = true,
["CHAT_MSG_RAID"] = true,
["CHAT_MSG_RAID_LEADER"] = true,
["CHAT_MSG_RAID_WARNING"] = true,
["CHAT_MSG_SAY"] = true,
["CHAT_MSG_YELL"] = true,
["CHAT_MSG_WHISPER"] = true,
["CHAT_MSG_CHANNEL"] = true,
}
local function Invite(text, ...)
if module.db.profile.linkinvite then
return module:ScanForLinks(text, Prat.SplitMessage.PLAYERLINK)
end
end
local INVALID_NAMES = {
["meh"] = true,
["now"] = true,
["plz"] = true,
["pls"] = true,
["please"] = true,
["when"] = true,
["group"] = true,
["raid"] = true,
["grp"] = true,
}
local INVALID_NAME_REFERENCE = {
["him"] = true,
["her"] = true,
["them"] = true,
["someone"] = true,
}
local function InviteSomone(text, name)
if module.db.profile.linkinvite and name then
name = name:lower() -- TODO Use UTF8Lib
if name:len() > 2 and not INVALID_NAMES[name] then
if INVALID_NAME_REFERENCE[name] then
return Prat:RegisterMatch(text)
else
return module:ScanForLinks(text, name)
end
end
end
end
Prat:SetModulePatterns(module, {
{ pattern = "(send%s+invite%s+to%s+" .. Prat.AnyNamePattern .. ")", matchfunc = InviteSomone },
{ pattern = "(invi?t?e?%s+" .. Prat.AnyNamePattern .. ")", matchfunc = InviteSomone },
{ pattern = "(" .. Prat.GetNamePattern("invites?%??") .. ")", matchfunc = Invite },
{ pattern = "(" .. Prat.GetNamePattern("inv%??") .. ")", matchfunc = Invite },
{ pattern = "(초대)", matchfunc = Invite },
{ pattern = "(組%??)$", matchfunc = Invite },
{ pattern = "(組我%??)$", matchfunc = Invite },
})
function module:Invite_Link(link, text, button, ...)
if self.db.profile.linkinvite then
local name = strsub(link, 8);
if (name and (strlen(name) > 0)) then
local begin = string.find(name, "%s[^%s]+$");
if (begin) then
name = strsub(name, begin + 1);
end
self:InviteUnit(name);
end
end
return false
end
function module:SetItemRef(link, ...)
if (strsub(link, 1, 6) == "player") then
self:Player_Link(link)
end
end
function module:Player_Link(link)
if self.db.profile.altinvite then
local name = strsub(link, 8);
if (name and (strlen(name) > 0)) then
local begin, nend = string.find(name, "%s*[^%s:]+");
if (begin) then
name = strsub(name, begin, nend);
end
if (IsAltKeyDown()) then
self:InviteUnit(name);
if ChatEdit_GetActiveWindow() then
ChatEdit_OnEscapePressed(ChatEdit_GetActiveWindow())
end
return false;
end
end
end
return true
end
function module:ScanForLinks(text, name)
if text == nil then
return ""
end
local enabled = self.db.profile.linkinvite
if enabled and self.CanInvite() then
if Prat.CurrentMessage then
if EVENTS_FOR_INVITE[Prat.CurrentMessage.EVENT] then
return self:InviteLink(text, name)
end
end
end
return text
end
function module:InviteLink(link, name)
return Prat:RegisterMatch(("|cff%s|Hinvplr:%s|h[%s]|h|r"):format("ffff00", name, link))
end
end)