Mercurial > wow > squawk
view Model.lua @ 19:431f2fce08f2
Added in link stripping
Coloured class names
Reply to specific squawk
Related squawks fixed
new arrow to indicate reply
limit to 140 characters
author | wobin |
---|---|
date | Tue, 12 May 2009 00:57:59 +1000 |
parents | a3328fffef5c |
children | 8df5d8ef2e27 |
line wrap: on
line source
local Model = Squawk.Model local Settings = Model.UserSettings local Controller = Squawk.Controller local View = Squawk.View -- Model -- --[[ --Each Squawk will have the following information: -- * Owner (Name) -- * Time (Epoch) -- * Message (140 characters) -- * ReplyTo (Name) -- * Related (Names) -- -- Each User will have the following lists: -- * Follower -- * Following -- * Blocked -- * Pending (Requests to follow that you haven't acted on) -- * Requested (Requests to follow that you have made) -- * Privacy State -- -- A user can only request to follow an online person. Requests can be approved -- on or offline, but the initial request must be made online. -- -- When a user makes a request to follow a private user, the subsequent paths occur: -- - Followee is added to Settings.Requested -- - Followee receives 'follow request' -> (their) Settings.Pending -- - Followee acts on request -> (their) Settings.Pending cleared -- 1) Follwer is online -- - Follower receives 'request accepted' -> Added to Settings.Following and -- cleared from Settings.Requested -- 2) Follower is offline -- - The next time Follower is online and recieves a Squawk we check if there -- is a Settings.Requested for that name, and if so assume they have approved -- and clear/add records appropriately. -- -- For updating, there can be a few methods. -- -- Guild open: you're not private, you broadcast to the guild your last X -- squawks on login -- -- followers: --]] Model.Squawks = {} local Squawks = Model.Squawks Squawks.Main = {} Squawks.Owners = {} local classcolours = { ["DEATHKNIGHT"] = "C41F3B", ["DRUID"] = "FF7D0A", ["HUNTER"] = "ABD473", ["MAGE"] = "69CCF0", ["PALADIN"] = "F58CBA", ["PRIEST"] = "FFFFFF", ["ROGUE"] = "FFF569", ["SHAMAN"] = "2459FF", ["WARLOCK"] = "9482C9", ["WARRIOR"] = "C79C6E", } local function wrap(str, limit) limit = limit or 72 local here = 1 return str:gsub("|c%x-|H.-|h(.-)|h|r", "%1"):gsub("(%s+)()(%S+)()", function(sp, st, word, fi) if fi-here > limit then here = st return "\n"..word end end) end function Squawks:new(Message, Owner, Class, ReplyStamp) View:Print("New: "..ReplyStamp) local o = {} o.Owner = Owner or UnitName("player") o.Message = wrap(Message) o.Time = time() local reply, to = strsplit("@", ((strsplit(" ", Message)))) if reply == "" then o.ReplyTo = to:match("%P+") -- Get everything except punctuation o.ReplyStamp = ReplyStamp end o.Related = {} for word in string.gmatch(Message, "@(%S+)") do if word ~= o.ReplyTo or "" then table.insert(o.Related, word) end end if #o.Related == 0 then o.Related = nil end table.insert(self.Main, o) if not self.Squawkers[Owner] then self.Squawkers[Owner] = {name = Owner, class=Class} end if not self.Owners[Owner] then self.Owners[Owner] = {} end table.insert(self.Owners[Owner], o) return o end function Squawks:OwnerString(squawk) return "|cff"..classcolours[self.Squawkers[squawk.Owner].class or "WARRIOR"]..squawk.Owner.."|r" end function Squawks:Reload() for _,squawk in ipairs(Model.Squawks.Main) do if not self.Owners[squawk.Owner] then self.Owners[squawk.Owner] = {} end table.insert(self.Owners[squawk.Owner], squawk) if squawk.Related and #squawk.Related == 0 then squawk.Related = nil end end end function Squawks:Sort(Squawks) table.sort(Squawks or self.Main, function(a,b) return a.Time > b.Time end) return Squawks or self.Main end function Squawks:GetOwn(Squawks) local mine = {} for _, squawk in ipairs(Squawks or self.Main) do if squawk.Owner == UnitName("player") then table.insert(mine, squawk) end end return self:Sort(mine) end function Squawks:GetLast10(Squawks) local mine = {} Squawks = Squawks or self.Main local limit = #Squawks < 10 and #Squawks or 10 Squawks = self:Sort(Squawks) for i=1,limit do table.insert(mine, Squawks[i]) end return mine end -- initially called with no arguments to get the latest timestamp of -- my squawks, or with a name to find the latest timestamp of all -- squawks from that user function Squawks:GetLatestTimestamp(Name, Squawks) if Name then if self.Owners[Name] then return self:GetLatestTimestamp(nil, self.Owners[Name]) else return -1 -- No squawks exist for that name in our records end end Squawks = Squawks or self.Main or {} local latest = self:Sort(Squawks) return latest and #latest > 0 and latest[1].Time or -1 end function Squawks:GetLatestSquawks(Timestamp) local latest = {} for i, squawk in ipairs(self:Sort()) do if squawk.Time > Timestamp and i < 10 then table.insert(latest, squawk) else return latest end end end function Settings:IsPrivate() return Settings.Private end function Settings:TogglePrivate() Settings.Private = not Settings.Private end function Settings:AddFollower(Name) Settings.Follower[Name] = 1 self:RemovePending(Name) end function Settings:AddFollowing(Name) Settings.Following[Name] = 1 self:RemoveRequested(Name) end function Settings:AddBlock(Name) Settings.Blocked[Name] = 1 self:RemoveFollower(Name) self:RemoveFollowing(Name) end function Settings:AddPending(Name) Settings.Pending[Name] = 1 end function Settings:AddRequested(Name) Settings.Requested[Name] = 1 end function Settings:RemoveFollower(Name) if Settings.Follower[Name] then Settings.Follower[Name] = nil end end function Settings:RemoveFollowing(Name) if Settings.Following[Name] then Settings.Following[Name] = nil end end function Settings:RemoveBlock(Name) if Settings.Blocked[Name] then Settings.Blocked[Name] = nil end end function Settings:RemovePending(Name) if Settings.Pending[Name] then Settings.Pending[Name] = nil end end function Settings:RemoveRequested(Name) if Settings.Requested[Name] then Settings.Requested[Name] = nil end end