Quantcast
local addonname, addon = ...

local loaddelay = 1.5

addon.DB_SV = 1
addon.DB_NOTES = 2

function addon:Initialize()
	self.frame = CreateFrame"Frame"
	self.frame:SetScript("OnEvent", function(frame, event, ...)
		if self[event] then
			self[event](addon, ...)
		end
	end)

	self.frame:RegisterEvent"ADDON_LOADED"
	self.frame:RegisterEvent"BN_FRIEND_INFO_CHANGED"
end


function addon:ADDON_LOADED(loaded)
	if loaded ~= addonname then return end

	MonikerDB = MonikerDB or {}
	MonikerConfig = MonikerConfig or { dbbackend = addon.DB_SV }

	self.config = MonikerConfig

	self.nicks_sv = MonikerDB
	self.nicks_notes = {}

	self:SetDBBackend(self.config.dbbackend)

	local elapsed = 0
	self.frame:SetScript("OnUpdate", function(frame, e)
		elapsed = elapsed + e
		if elapsed > loaddelay then
			frame:SetScript("OnUpdate", nil)

			self:CreateHooks()
		end
	end)

	self:CreateConfig()
end

function addon:BN_FRIEND_INFO_CHANGED(i)
	if not i then return end

	local _, firstname, lastname, _, _, _, _, _, _, _, _, note = BNGetFriendInfo(i)

	if note and #note > 0 then
		self.nicks_notes[firstname.." "..lastname] = note
	else
		self.nicks_notes[firstname.." "..lastname] = nil
	end

	self:Update()
end


function addon:UpdatePopup()
	local function add(popup, idx, name)
		for i,v in ipairs(popup) do
			if v == name then
				break
			end
		end

		table.insert(popup, idx, name)
	end

	local function remove(popup, name)
		for i,v in ipairs(popup) do
			if v == name then
				table.remove(popup, i)
				break
			end
		end
	end

	if self.config.dbbackend == addon.DB_NOTES then
		remove(UnitPopupMenus["BN_FRIEND"], "BN_RENAME")
		remove(UnitPopupMenus["BN_FRIEND_OFFLINE"], "BN_RENAME")
	else
		add(UnitPopupMenus["BN_FRIEND"], 7, "BN_RENAME")
		add(UnitPopupMenus["BN_FRIEND_OFFLINE"], 2, "BN_RENAME")
	end
end

function addon:Update()
	if not InCombatLockdown() then
		FriendsFrame_Update()
	end
end

function addon:SetDBBackend(dbtype)
	if dbtype == addon.DB_NOTES then
		table.wipe(self.nicks_notes)

		for i = 1, BNGetNumFriends() do
			self:BN_FRIEND_INFO_CHANGED(i)
		end

		self.nicks = self.nicks_notes
	else
		self.nicks = self.nicks_sv
	end

	self:UpdatePopup()
	self:Update()
end

function addon:CreateHooks()
	for n, func in pairs(self.hooks) do
		func()
	end
end

function addon:GetNickname(name)
	return self.nicks[name]
end

function addon:SetNickname(name, nickname)
	if name == nickanme or #nickname == 0 then
		nickname = nil
	end

	self.nicks[name] = nickname

	self:Update()
end

function addon:IterNicknames()
	return pairs(self.nicks)
end

function Moniker_BNGetFriendInfo(...)
	local pid, firstname, lastname = BNGetFriendInfo(...)
	local name = firstname.." "..lastname
	local nickname = addon:GetNickname(name)

	if nickname then
		firstname = nickname
		lastname = ""
	end

	return pid, firstname, lastname, select(4, BNGetFriendInfo(...))
end

function Moniker_BNGetFriendInfoByID(...)
	local pid, firstname, lastname = BNGetFriendInfoByID(...)
	local name = firstname.." "..lastname
	local nickname = addon:GetNickname(name)

	if nickname then
		firstname = nickname
		lastname = ""
	end

	return pid, firstname, lastname, select(4, BNGetFriendInfoByID(...))
end

addon:Initialize()