---------------------------------------------------------------------------------
--
-- Prat - A framework for World of Warcraft chat mods
--
-- Copyright (C) 2006-2020 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 function dbg ( ... ) end
--[==[@debug@
-- function dbg(...) Prat:PrintLiteral(...) end
--@end-debug@]==]
local PRAT_MODULE = Prat : RequestModuleName ( " Memory " )
if PRAT_MODULE == nil then
return
end
local module = Prat : NewModule ( PRAT_MODULE , " AceHook-3.0 " , " AceEvent-3.0 " , " AceTimer-3.0 " )
-- define localized strings
local PL = module.PL
Prat : SetModuleDefaults ( module.name , {
profile = {
on = true ,
frames = { [ " * " ] = { } } ,
types = { } ,
cvars = { } ,
autoload = false
}
} )
--[==[@debug@
PL : AddLocale ( PRAT_MODULE , " enUS " , {
[ " module_name " ] = " Memory " ,
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
module_info = " |cffff8888THIS MODULE IS EXPERIMENTAL|r \n \n This module allows you to load/save all your chat settings and frame layout. These settings can be loaded on any of your characters " ,
autoload_name = " Load Settings Automatically " ,
autoload_desc = " Automatically load the saved settings when you log in " ,
load_name = " Load Settings " ,
load_desc = " Load the chat frame/tabs from the last save " ,
save_name = " Save Settings " ,
save_desc = " Save the current chat frame/tab configuration " ,
msg_nosettings = " No stored settings " ,
msg_settingsloaded = " Settings Loaded " ,
command_header_name = " Commands " ,
options_header_name = " Options " ,
msg_loadfailed = " Could not fully restore the chat settings "
} )
--@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 = {
[ " Memory " ] = {
[ " autoload_desc " ] = " Automatically load the saved settings when you log in " ,
[ " autoload_name " ] = " Load Settings Automatically " ,
[ " command_header_name " ] = " Commands " ,
[ " load_desc " ] = " Load the chat frame/tabs from the last save " ,
[ " load_name " ] = " Load Settings " ,
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
[ " module_info " ] = [ = [ | cffff8888THIS MODULE IS EXPERIMENTAL | r
This module allows you to load / save all your chat settings and frame layout . These settings can be loaded on any of your characters ] = ] ,
[ " module_name " ] = " Memory " ,
[ " msg_loadfailed " ] = " Could not fully restore the chat settings " ,
[ " msg_nosettings " ] = " No stored settings " ,
[ " msg_settingsloaded " ] = " Settings Loaded " ,
[ " options_header_name " ] = " Options " ,
[ " save_desc " ] = " Save the current chat frame/tab configuration " ,
[ " save_name " ] = " Save Settings " ,
}
}
PL : AddLocale ( PRAT_MODULE , " enUS " , L )
L = {
[ " Memory " ] = {
--[[Translation missing --]]
[ " autoload_desc " ] = " Automatically load the saved settings when you log in " ,
--[[Translation missing --]]
[ " autoload_name " ] = " Load Settings Automatically " ,
--[[Translation missing --]]
[ " command_header_name " ] = " Commands " ,
--[[Translation missing --]]
[ " load_desc " ] = " Load the chat frame/tabs from the last save " ,
--[[Translation missing --]]
[ " load_name " ] = " Load Settings " ,
--[[Translation missing --]]
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
--[[Translation missing --]]
[ " module_info " ] = [ = [ | cffff8888THIS MODULE IS EXPERIMENTAL | r
This module allows you to load / save all your chat settings and frame layout . These settings can be loaded on any of your characters ] = ] ,
--[[Translation missing --]]
[ " module_name " ] = " Memory " ,
--[[Translation missing --]]
[ " msg_loadfailed " ] = " Could not fully restore the chat settings " ,
--[[Translation missing --]]
[ " msg_nosettings " ] = " No stored settings " ,
--[[Translation missing --]]
[ " msg_settingsloaded " ] = " Settings Loaded " ,
--[[Translation missing --]]
[ " options_header_name " ] = " Options " ,
--[[Translation missing --]]
[ " save_desc " ] = " Save the current chat frame/tab configuration " ,
--[[Translation missing --]]
[ " save_name " ] = " Save Settings " ,
}
}
PL : AddLocale ( PRAT_MODULE , " itIT " , L )
L = {
[ " Memory " ] = {
--[[Translation missing --]]
[ " autoload_desc " ] = " Automatically load the saved settings when you log in " ,
--[[Translation missing --]]
[ " autoload_name " ] = " Load Settings Automatically " ,
--[[Translation missing --]]
[ " command_header_name " ] = " Commands " ,
--[[Translation missing --]]
[ " load_desc " ] = " Load the chat frame/tabs from the last save " ,
--[[Translation missing --]]
[ " load_name " ] = " Load Settings " ,
--[[Translation missing --]]
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
--[[Translation missing --]]
[ " module_info " ] = [ = [ | cffff8888THIS MODULE IS EXPERIMENTAL | r
This module allows you to load / save all your chat settings and frame layout . These settings can be loaded on any of your characters ] = ] ,
--[[Translation missing --]]
[ " module_name " ] = " Memory " ,
--[[Translation missing --]]
[ " msg_loadfailed " ] = " Could not fully restore the chat settings " ,
--[[Translation missing --]]
[ " msg_nosettings " ] = " No stored settings " ,
--[[Translation missing --]]
[ " msg_settingsloaded " ] = " Settings Loaded " ,
--[[Translation missing --]]
[ " options_header_name " ] = " Options " ,
--[[Translation missing --]]
[ " save_desc " ] = " Save the current chat frame/tab configuration " ,
--[[Translation missing --]]
[ " save_name " ] = " Save Settings " ,
}
}
PL : AddLocale ( PRAT_MODULE , " ptBR " , L )
L = {
[ " Memory " ] = {
--[[Translation missing --]]
[ " autoload_desc " ] = " Automatically load the saved settings when you log in " ,
--[[Translation missing --]]
[ " autoload_name " ] = " Load Settings Automatically " ,
--[[Translation missing --]]
[ " command_header_name " ] = " Commands " ,
--[[Translation missing --]]
[ " load_desc " ] = " Load the chat frame/tabs from the last save " ,
--[[Translation missing --]]
[ " load_name " ] = " Load Settings " ,
--[[Translation missing --]]
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
--[[Translation missing --]]
[ " module_info " ] = [ = [ | cffff8888THIS MODULE IS EXPERIMENTAL | r
This module allows you to load / save all your chat settings and frame layout . These settings can be loaded on any of your characters ] = ] ,
--[[Translation missing --]]
[ " module_name " ] = " Memory " ,
--[[Translation missing --]]
[ " msg_loadfailed " ] = " Could not fully restore the chat settings " ,
--[[Translation missing --]]
[ " msg_nosettings " ] = " No stored settings " ,
--[[Translation missing --]]
[ " msg_settingsloaded " ] = " Settings Loaded " ,
--[[Translation missing --]]
[ " options_header_name " ] = " Options " ,
--[[Translation missing --]]
[ " save_desc " ] = " Save the current chat frame/tab configuration " ,
--[[Translation missing --]]
[ " save_name " ] = " Save Settings " ,
}
}
PL : AddLocale ( PRAT_MODULE , " frFR " , L )
L = {
[ " Memory " ] = {
[ " autoload_desc " ] = " Ladet die gespeicherten Einstellungen automatisch, wenn du dich anmeldest " ,
[ " autoload_name " ] = " Einstellungen automatisch laden " ,
[ " command_header_name " ] = " Befehle " ,
[ " load_desc " ] = " Ladet den Chat-Rahmen/Registerkarten aus der letzten Speicherung " ,
[ " load_name " ] = " Einstellungen laden " ,
[ " module_desc " ] = " Unterstützt das Speichern der Blizzard-Chat Einstellungen in deinem Profil, damit sie für alle deine Charaktere synchronisiert werden können " ,
[ " module_info " ] = " |cffff8888DIESES MODUL IST EXPERIMENTELL|r Mit diesem Modul kannst du alle deine Chat-Einstellungen und deine Rahmenanordnung laden/speichern. Diese Einstellungen können auf jeden deiner Charaktere geladen werden " ,
[ " module_name " ] = " Erinnerung " ,
[ " msg_loadfailed " ] = " Die Chat-Einstellungen konnten nicht vollständig wiederhergestellt werden " ,
[ " msg_nosettings " ] = " Keine gespeicherten Einstellungen " ,
[ " msg_settingsloaded " ] = " Einstellungen geladen " ,
[ " options_header_name " ] = " Optionen " ,
[ " save_desc " ] = " Speichert die aktuelle Konfiguration des Chat-Rahmens/Registerkarte " ,
[ " save_name " ] = " Einstellungen speichern " ,
}
}
PL : AddLocale ( PRAT_MODULE , " deDE " , L )
L = {
[ " Memory " ] = {
[ " autoload_desc " ] = " 로그인시 저장된 설정을 자동으로 불러옵니다. " ,
[ " autoload_name " ] = " 자동 설정 불러오기 " ,
[ " command_header_name " ] = " 명령어 " ,
[ " load_desc " ] = " 마지막 저장에서 대화창/탭을 불러옴 " ,
[ " load_name " ] = " 불러오기 설정 " ,
[ " module_desc " ] = " 블리자드 채팅 설정을 프로필에 저장하여 모든 캐릭터와 동기화 할 수 있도록 지원 " ,
[ " module_info " ] = " |cffff8888이 모듈은 실험적입니다.|r 이 모듈을 사용하면 모든 채팅 설정 및 프레임 모양을 불러오기/저장할 수 있습니다. 이 설정은 모든 캐릭터에서 불러오기 할 수 있습니다. " ,
[ " module_name " ] = " 메모리 [Memory] " ,
[ " msg_loadfailed " ] = " 대화 설정을 완전히 복구하지 못했습니다 " ,
[ " msg_nosettings " ] = " 저장된 설정 없음 " ,
[ " msg_settingsloaded " ] = " 설정 불러옴 " ,
[ " options_header_name " ] = " 옵션 " ,
[ " save_desc " ] = " 정확한 대화창/탭 구성을 저장 " ,
[ " save_name " ] = " 저장 설정 " ,
}
}
PL : AddLocale ( PRAT_MODULE , " koKR " , L )
L = {
[ " Memory " ] = {
--[[Translation missing --]]
[ " autoload_desc " ] = " Automatically load the saved settings when you log in " ,
--[[Translation missing --]]
[ " autoload_name " ] = " Load Settings Automatically " ,
--[[Translation missing --]]
[ " command_header_name " ] = " Commands " ,
--[[Translation missing --]]
[ " load_desc " ] = " Load the chat frame/tabs from the last save " ,
--[[Translation missing --]]
[ " load_name " ] = " Load Settings " ,
--[[Translation missing --]]
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
--[[Translation missing --]]
[ " module_info " ] = [ = [ | cffff8888THIS MODULE IS EXPERIMENTAL | r
This module allows you to load / save all your chat settings and frame layout . These settings can be loaded on any of your characters ] = ] ,
--[[Translation missing --]]
[ " module_name " ] = " Memory " ,
--[[Translation missing --]]
[ " msg_loadfailed " ] = " Could not fully restore the chat settings " ,
--[[Translation missing --]]
[ " msg_nosettings " ] = " No stored settings " ,
--[[Translation missing --]]
[ " msg_settingsloaded " ] = " Settings Loaded " ,
--[[Translation missing --]]
[ " options_header_name " ] = " Options " ,
--[[Translation missing --]]
[ " save_desc " ] = " Save the current chat frame/tab configuration " ,
--[[Translation missing --]]
[ " save_name " ] = " Save Settings " ,
}
}
PL : AddLocale ( PRAT_MODULE , " esMX " , L )
L = {
[ " Memory " ] = {
[ " autoload_desc " ] = " Автоматически загружать сохраненные настройки при входе в систему " ,
[ " autoload_name " ] = " Загружать настройки автоматически " ,
[ " command_header_name " ] = " Команды " ,
[ " load_desc " ] = " Загрузить фрейм/вкладки чата из последнего сохранения " ,
[ " load_name " ] = " Загрузить настройки " ,
[ " module_desc " ] = " Поддержите сохранение настроек чата Blizzard в вашем профиле, чтобы их можно было синхронизировать со всеми вашими персонажами. " ,
[ " module_info " ] = " |cffff8888 ЭТОТ МОДУЛЬ ЯВЛЯЕТСЯ ЭКСПЕРИМЕНТАЛЬНЫМ|r Этот модуль позволяет загружать/сохранять все настройки чата и разметки. Эти настройки можно загрузить на любого из ваших персонажей. " ,
[ " module_name " ] = " Память " ,
[ " msg_loadfailed " ] = " Не удалось полностью восстановить настройки чата " ,
[ " msg_nosettings " ] = " Нет сохраненных настроек " ,
[ " msg_settingsloaded " ] = " Настройки загружены " ,
[ " options_header_name " ] = " Параметры " ,
[ " save_desc " ] = " Сохраните текущую конфигурацию фрейма/вкладки чата " ,
[ " save_name " ] = " Сохранить настройки " ,
}
}
PL : AddLocale ( PRAT_MODULE , " ruRU " , L )
L = {
[ " Memory " ] = {
[ " autoload_desc " ] = " 登录时自动加载保存过的设置 " ,
[ " autoload_name " ] = " 自动加载设置 " ,
[ " command_header_name " ] = " 命令 " ,
[ " load_desc " ] = " 加载上次保存的聊天框/标签 " ,
[ " load_name " ] = " 加载设置 " ,
[ " module_desc " ] = " 支持将官方聊天设置保存到你的个人设置中,以便你可以在所有角色之间进行同步。 " ,
[ " module_info " ] = [ = [ | cffff8888此模块是实验性的 | r
该 模 块 允 许 你 加 载 / 保 存 所 有 的 聊 天 设 置 和 框 体 布 局 。 这 些 设 置 可 以 导 入 到 你 的 其 他 账 号 内 ] = ] ,
[ " module_name " ] = " 内存 " ,
[ " msg_loadfailed " ] = " 无法完全恢复聊天设置 " ,
[ " msg_nosettings " ] = " 没有保存的设置 " ,
[ " msg_settingsloaded " ] = " 设置已加载 " ,
[ " options_header_name " ] = " 选项 " ,
[ " save_desc " ] = " 保存当前的聊天框/标签设置 " ,
[ " save_name " ] = " 保存设置 " ,
}
}
PL : AddLocale ( PRAT_MODULE , " zhCN " , L )
L = {
[ " Memory " ] = {
--[[Translation missing --]]
[ " autoload_desc " ] = " Automatically load the saved settings when you log in " ,
--[[Translation missing --]]
[ " autoload_name " ] = " Load Settings Automatically " ,
--[[Translation missing --]]
[ " command_header_name " ] = " Commands " ,
--[[Translation missing --]]
[ " load_desc " ] = " Load the chat frame/tabs from the last save " ,
--[[Translation missing --]]
[ " load_name " ] = " Load Settings " ,
--[[Translation missing --]]
[ " module_desc " ] = " Support saving the Blizzard chat settings to your profile so they can be synced across all your characters " ,
--[[Translation missing --]]
[ " module_info " ] = [ = [ | cffff8888THIS MODULE IS EXPERIMENTAL | r
This module allows you to load / save all your chat settings and frame layout . These settings can be loaded on any of your characters ] = ] ,
--[[Translation missing --]]
[ " module_name " ] = " Memory " ,
--[[Translation missing --]]
[ " msg_loadfailed " ] = " Could not fully restore the chat settings " ,
--[[Translation missing --]]
[ " msg_nosettings " ] = " No stored settings " ,
--[[Translation missing --]]
[ " msg_settingsloaded " ] = " Settings Loaded " ,
--[[Translation missing --]]
[ " options_header_name " ] = " Options " ,
--[[Translation missing --]]
[ " save_desc " ] = " Save the current chat frame/tab configuration " ,
--[[Translation missing --]]
[ " save_name " ] = " Save Settings " ,
}
}
PL : AddLocale ( PRAT_MODULE , " esES " , L )
L = {
[ " Memory " ] = {
[ " autoload_desc " ] = " 登录时自动加载保存过的设置 " ,
[ " autoload_name " ] = " 自动加载设置 " ,
[ " command_header_name " ] = " 命令 " ,
[ " load_desc " ] = " 加载上次保存的聊天框/标签 " ,
[ " load_name " ] = " 加载设置 " ,
[ " module_desc " ] = " 支持将官方聊天设置保存到你的个人设置中,以便你可以在所有角色之间进行同步。 " ,
[ " module_info " ] = [ = [ | cffff8888此模块是实验性的 | r
该 模 块 允 许 你 加 载 / 保 存 所 有 的 聊 天 设 置 和 框 体 布 局 。 这 些 设 置 可 以 导 入 到 你 的 其 他 账 号 内 ] = ] ,
[ " module_name " ] = " 内存 " ,
[ " msg_loadfailed " ] = " 无法完全恢复聊天设置 " ,
[ " msg_nosettings " ] = " 没有保存的设置 " ,
[ " msg_settingsloaded " ] = " 设置已加载 " ,
[ " options_header_name " ] = " 选项 " ,
[ " save_desc " ] = " 保存当前的聊天框/标签设置 " ,
[ " save_name " ] = " 保存设置 " ,
}
}
PL : AddLocale ( PRAT_MODULE , " zhTW " , L )
end
--@end-non-debug@
local toggleOption = {
name = function ( info ) return info.handler . PL [ info [ # info ] .. " _name " ] end ,
desc = function ( info ) return info.handler . PL [ info [ # info ] .. " _desc " ] end ,
type = " toggle " ,
}
Prat : SetModuleOptions ( module.name , {
name = PL.module_name ,
desc = PL.module_desc ,
type = " group " ,
args = {
info = {
name = PL.module_info ,
type = " description " ,
} ,
command_header = {
name = PL.command_header_name ,
type = " header " ,
order = 190 ,
} ,
save = {
name = PL.save_name ,
desc = PL.save_desc ,
type = " execute " ,
order = 191 ,
func = " SaveSettings "
} ,
load = {
name = PL.load_name ,
desc = PL.load_desc ,
type = " execute " ,
order = 190 ,
func = " LoadSettings "
} ,
options_header = {
name = PL.options_header_name ,
type = " header " ,
order = 195 ,
} ,
autoload = {
name = PL.autoload_name ,
desc = PL.autoload_desc ,
type = " toggle " ,
order = 200 ,
}
}
} )
local cvars = {
whisperMode = " CVar " ,
chatStyle = " CVar " ,
wholeChatWindowClickable = " CVarBool " ,
whisperMode = " CVar " ,
blockChannelInvites = " CVarBool "
}
Prat : SetModuleInit ( module.name ,
function ( self )
self : RegisterEvent ( " PLAYER_ENTERING_WORLD " )
end )
function module : PLAYER_ENTERING_WORLD ( )
self : UnregisterEvent ( " PLAYER_ENTERING_WORLD " )
self.ready = true
if self.needsLoading then
self : ScheduleTimer ( " LoadSettings " , 0 )
end
end
function module : OnModuleEnable ( )
if not self.working and self.db . profile.autoload and next ( self.db . profile.frames ) then
if not self.ready then
self.needsLoading = true
else
self : ScheduleTimer ( " LoadSettings " , 0 )
end
end
Prat.RegisterChatEvent ( self , Prat.Events . PRE_ADDMESSAGE )
end
function module : SaveSettings ( )
local db = self.db . profile
wipe ( db.frames )
for i = 1 , NUM_CHAT_WINDOWS do
self : SaveSettingsForFrame ( i )
end
db.types = CopyTable ( getmetatable ( ChatTypeInfo ) . __index )
db.channels = { GetChannelList ( ) }
for k , v in pairs ( cvars ) do
db.cvars [ k ] = _G [ " Get " .. v ] ( k )
end
self : Output ( " Settings Saved " )
end
function module : SaveSettingsForFrame ( frameId )
local db = self.db . profile.frames [ frameId ]
local name , fontSize , r , g , b , alpha , shown , locked , docked , uninteractable = GetChatWindowInfo ( frameId )
db.name , db.fontSize , db.r , db.g , db.b , db.alpha , db.shown , db.locked , db.docked , db.uninteractable =
name , fontSize , r , g , b , alpha , shown , locked , docked , uninteractable
local f = Chat_GetChatFrame ( frameId )
db.minimized = f.minimized
if f.minFrame then
db.minframe = { }
for i = 1 , f.minFrame : GetNumPoints ( ) do
local point , relativeTo , relativePoint , xoff , yoff = f.minFrame : GetPoint ( i )
db.minframe [ # db.minframe + 1 ] = { point , ( type ( relativeTo ) == " table " ) and relativeTo : GetName ( ) or relativeTo , relativePoint , xoff , yoff }
end
end
db.messages = { GetChatWindowMessages ( frameId ) }
db.channels = { GetChatWindowChannels ( frameId ) }
local width , height = GetChatWindowSavedDimensions ( frameId ) ;
local point , xOffset , yOffset = GetChatWindowSavedPosition ( frameId )
db.point , db.xOffset , db.yOffset , db.width , db.height =
point , xOffset , yOffset , width , height
end
-- Warning: This function causes taint with DF edit mode
function module : LoadFrameSettingsForFrame ( frameId )
local db = self.db . profile.frames [ frameId ]
local success = true
local f = Chat_GetChatFrame ( frameId )
if not db.shown and not db.docked then
FCF_Close ( f )
return success
end
if f.minimized then
FCF_MaximizeFrame ( f )
end
-- Restore FloatingChatFrame
SetChatWindowName ( frameId , db.name )
SetChatWindowSize ( frameId , db.fontSize )
SetChatWindowColor ( frameId , db.r , db.g , db.b )
SetChatWindowAlpha ( frameId , db.alpha )
SetChatWindowDocked ( frameId , db.docked )
SetChatWindowLocked ( frameId , db.locked )
SetChatWindowUninteractable ( frameId , db.uninteractable )
SetChatWindowSavedDimensions ( frameId , db.width , db.height )
if db.point then
SetChatWindowSavedPosition ( frameId , db.point , db.xOffset , db.yOffset )
end
SetChatWindowShown ( frameId , db.shown )
FloatingChatFrame_Update ( frameId , 1 )
FCF_DockUpdate ( )
ChatEdit_DeactivateChat ( f.editBox )
FCF_FadeInChatFrame ( f )
if db.minimized then
FCF_MinimizeFrame ( f , " LEFT " )
f.minFrame : ClearAllPoints ( )
for i , v in ipairs ( db.minframe ) do
local point , relativeTo , relativePoint , xoff , yoff = unpack ( v )
f.minFrame : SetPoint ( point , relativeTo and _G [ relativeTo ] , relativePoint , xoff , yoff )
end
f.minFrame : SetUserPlaced ( true )
end
return success
end
function module : LoadChatSettingsForFrame ( frameId )
local db = self.db . profile.frames [ frameId ]
local success = true
local f = Chat_GetChatFrame ( frameId )
-- Restore ChatFrame
ChatFrame_RemoveAllMessageGroups ( f )
for _ , v in ipairs ( db.messages ) do
ChatFrame_AddMessageGroup ( f , v ) ;
end
ChatFrame_RemoveAllChannels ( f )
for i = 1 , # db.channels , 2 do
local chan = ChatFrame_AddChannel ( f , db.channels [ i ] )
if not chan then
dbg ( " failed to load " , db.channels [ i ] , chan )
success = false
end
end
ChatFrame_ReceiveAllPrivateMessages ( f )
return success
end
function module : LeaveChannels ( ... )
local db = self.db . profile
local map = self : GetChannelMap ( unpack ( db.channels ) )
for i = 1 , select ( " # " , ... ) , 3 do
local snum , sname = select ( i , ... ) ;
local num , name = map [ sname ] , map [ snum ] ;
if snum ~= num or sname ~= name then
dbg ( " leave " , snum , sname , num , name )
LeaveChannelByName ( snum )
end
end
end
local channelStepDelay = 0.5
local function getDelay ( )
return channelStepDelay + module.errorcount
end
function module : LeavePlaceholderChannels ( ... )
dbg ( " leave placeholders " , ... )
for i = 1 , select ( " # " , ... ) , 3 do
local num , name = select ( i , ... ) ;
if name : match ( " ^LeaveMe " ) then
dbg ( " leave " , num , name )
LeaveChannelByName ( num )
end
end
self : ScheduleTimer ( function ( ) module : CheckChannels ( GetChannelList ( ) ) end , getDelay ( ) )
end
function module : GetChannelMap ( ... )
local map = { }
for i = 1 , select ( " # " , ... ) , 3 do
local num , name = select ( i , ... ) ;
map [ name ] = num
map [ num ] = name
end
return map
end
function module : CheckChannels ( ... )
dbg ( " check channels " , ... )
local db = self.db . profile
local map = self : GetChannelMap ( unpack ( db.channels ) )
local correct = true
if select ( " # " , ... ) ~= # db.channels then
correct = " wrong "
else
for i = 1 , select ( " # " , ... ) , 3 do
local snum , sname = select ( i , ... ) ;
local num , name = db.channels [ i ] , db.channels [ i + 1 ] ;
if snum ~= num or sname ~= name then
dbg ( " mismatch " , snum , num , sname , name , map [ sname ] )
correct = map [ sname ] and " order " or " wrong "
end
end
end
dbg ( " channels correct " , correct )
if type ( correct ) == " boolean " or self.errorcount >= 3 then
self : ScheduleTimer ( " LoadSettings " , 0 )
else
if correct == " wrong " then
self : LeaveChannels ( GetChannelList ( ) )
self : ScheduleTimer ( " RestoreChannels " , getDelay ( ) , unpack ( db.channels ) )
self.errorcount = self.errorcount + 1
elseif correct == " order " then
dbg ( GetChannelList ( ) )
for i = 1 , select ( " # " , ... ) , 3 do
local snum , sname = select ( i , GetChannelList ( ) ) ;
local curnum = map [ sname ]
dbg ( " check " , snum , curnum )
-- we check if the channel is joined and was joined in the past before
-- doing anything (avoids nil reference error on some new characters)
if curnum ~= nil and snum ~= nil and snum ~= curnum then
dbg ( " swap " , snum , curnum )
if Prat.IsClassic then
SwapChatChannelByLocalID ( snum , curnum )
else
C_ChatInfo.SwapChatChannelsByChannelIndex ( snum , curnum )
end
end
end
self : ScheduleTimer ( function ( ) module : CheckChannels ( GetChannelList ( ) ) end , getDelay ( ) )
end
end
end
if Prat.IsClassic then
function module : RestoreChannels ( ... )
local index = 1
for i = 1 , select ( " # " , ... ) , 3 do
local num , name = select ( i , ... ) ;
dbg ( " restore " , name , num )
while index < num do
if GetChannelName ( index ) == 0 then
JoinTemporaryChannel ( " LeaveMe " .. index )
dbg ( " join " , " LeaveMe " .. index )
end
index = index + 1
end
if GetChannelName ( index ) == 0 then
dbg ( " join " , name )
JoinChannelByName ( name )
else
dbg ( " occupied " , name , select ( 2 , GetChannelName ( index ) ) )
end
index = index + 1
end
self : ScheduleTimer ( function ( ) module : LeavePlaceholderChannels ( GetChannelList ( ) ) end , getDelay ( ) )
end
else
function module : RestoreChannels ( ... )
local index = 1
for i = 1 , select ( " # " , ... ) , 3 do
local num , name = select ( i , ... ) ;
dbg ( " restore " , name , num )
while index < num do
if GetChannelName ( index ) == 0 then
JoinTemporaryChannel ( " LeaveMe " .. index )
dbg ( " join " , " LeaveMe " .. index )
else
dbg ( " skip " , index )
end
index = index + 1
end
if GetChannelName ( index ) == 0 then
local clubId , streamId = ChatFrame_GetCommunityAndStreamFromChannel ( name ) ;
if not clubId or not streamId then
dbg ( " join " , name )
JoinChannelByName ( name )
else
dbg ( " addclub " , clubId , streamId )
ChatFrame_AddNewCommunitiesChannel ( 1 , clubId , streamId )
end
else
dbg ( " occupied " , name , select ( 2 , GetChannelName ( index ) ) )
end
index = index + 1
end
self : ScheduleTimer ( function ( ) module : LeavePlaceholderChannels ( GetChannelList ( ) ) end , getDelay ( ) )
end
end
function module : LoadSettings ( )
local db = self.db . profile
local success = true
if not next ( db.frames ) then
self : Output ( PL.msg_nosettings )
self.needsLoading = nil
return
end
if not self.working then
self.working = { }
end
-- restore CVars
if not self.working . cvars then
for k , v in pairs ( cvars ) do
local val = db.cvars [ k ]
if val ~= nil then
dbg ( " set cvar " , k , val )
SetCVar ( k , val )
end
end
self.working . cvars = true
end
-- Disabled for retail because it causes taint errors with edit mode
if Prat.IsClassic then
-- restore frame appearance and layout
if not self.working . frames then
for k , v in pairs ( db.frames ) do
if not self : LoadFrameSettingsForFrame ( k ) then
success = false
end
end
FCFDock_SelectWindow ( GENERAL_CHAT_DOCK , ChatFrame1 )
self.working . frames = success
end
end
-- restore chat channels
if not self.working . channels and db.channels and # db.channels > 0 then
self.errorcount = 0
self : ScheduleTimer ( " CheckChannels " , getDelay ( ) , GetChannelList ( ) )
self.working . channels = true
return
end
-- restore channels and messages to chatframes
if not self.working . chatframes then
for k , v in pairs ( db.frames ) do
if not self : LoadChatSettingsForFrame ( k ) then
success = false
end
end
self.working . chatframes = success
end
-- restore chat colors
if not self.working . colorsa then
for k , v in pairs ( db.types ) do
ChangeChatColor ( k , v.r , v.g , v.b )
end
self.working . colorsa = true
end
if success then
self.needsLoading = nil
self.working = nil
self.errorcount = nil
self : Output ( PL.msg_settingsloaded )
else
self.errorcount = self.errorcount + 1
if self.errorcount > 10 then
self.working = nil
self.errorcount = nil
self : Output ( PL.msg_loadfailed )
return
end
self : ScheduleTimer ( " LoadSettings " , getDelay ( ) )
end
end
function module : Prat_PreAddMessage ( arg , message , frame , event , t , r , g , b )
if self.working and ( " YOU_CHANGED " == message.NOTICE or " YOU_LEFT " == message.NOTICE ) then
message.DONOTPROCESS = true
end
end
end )