view Controller.lua @ 18:a3328fffef5c

Split of main file into components
author wobin
date Thu, 07 May 2009 02:52:23 +1000
parents
children 431f2fce08f2
line wrap: on
line source
local Controller = Squawk.Controller
local Model = Squawk.Model
local View = Squawk.View
local Settings = Model.UserSettings
local Squawks = Model.Squawks

--Controller--

function Controller:TheyWantToFollowMe(Name)
	if Settings:IsPrivate() then
		Settings:AddPending(Name)
		self:PutForwardFollowRequest(Name)
		self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
	else
		Settings:AddFollower(Name)
		View:NotifyOfNewFollower(Name)
		self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
	end
end

function Controller:TheyWantToUnfollowMe(Name)
	Settings:RemoveFollower(Name)
end

function Controller:IWantToFollowThem(Name)
	self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
	Settings:AddRequested(Name)
end

function Controller:IWantToUnfollowThem(Name)
	Settings:RemoveFollowing(Name)
	self:SendMessageToTarget(Name, "#Unfollow|"..UnitName("player"))
	View:NotifyOfUnfollowing(Name)
end

function Controller:IAmNowFollowingThem(Name)
	Settings:AddFollowing(Name)
	View:NotifyOfNewFollowing(Name)
end

function Controller:AddANewSquawk(Name, Message, Source)
	if not Settings.Blocked[Name] then
	
		if Source == "WHISPER" then
			if Settings.Requested[Name] then -- We've been approved offline!
				Settings:AddFollowing(Name)
			end

			if not Settings.Following[Name] then -- If we're no longer following this person
				self:SendMessageToTarget(Name, "#Unfollow|"..UnitName("player"))
				return
			end
		end	
		
		if Source == "GUILD" and Name == UnitName("player") then
			return
		end

		table.insert(Model.Squawks, Squawks:new(Message, Name))
		View:UpdateSquawkList()	
	end
end

local trigger
local function RepressFailure(frame, event, ...)
	if arg1:match(string.gsub(ERR_CHAT_PLAYER_NOT_FOUND_S, "%%s", "(.*)")) then
		if trigger then Controller:CancelTimer(trigger, true) end
		trigger = Controller:ScheduleTimer(
				function() 
					ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", RepressFailure) 
				end, 3) -- Give it three seconds and then remove the filter.
		return true
	else
		return false, unpack(...)
	end
end

function Controller:SendNewSquawk(Message)
	if not Settings:IsPrivate() then
		self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
	end

	self:AddANewSquawk(UnitName("player"), Message)
	for name, _ in pairs(Settings.Following) do
		self:SendMessageToTarget(name, "#Squawk|"..UnitName("player").."|"..Message)
	end
end

function Controller:ImPending(Name)
	View:NotifyOfPending(Name)
end

function Controller:PutForwardFollowRequest(Name)
	View:NotifyOfPendingRequest(Name)
end

function Controller:ApprovePendingRequest(Name)
	Settings:AddFollower(Name)
	View:NotifyOfNewFollower(Name)
	self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
end



function Controller:SendMessageToTarget(Name, Message)
	ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", RepressFailure)
	self:SendCommMessage("Squawk", Message, "WHISPER", Name)
end

function Controller:SendMessageToGuild(Message)
	self:SendCommMessage("Squawk", Message, "GUILD")
end

local Parse = { 
		["#Pending"] = Controller.ImPending,
		["#Follow"] = Controller.IAmNowFollowingThem,
		["#Unfollow"] = Controller.TheyWantToUnfollowMe,
		["#Squawk"] = Controller.AddANewSquawk,
		["#Request"] = Controller.TheyWantToFollowMe,
	}

function Controller:ReceiveMessage(Message, Distribution, Sender)
	local command, name, info = strsplit("|",Message)
	View:Print(Distribution..":"..Message)
	Parse[command](Controller, name, info, Distribution)
end