annotate Squawk.lua @ 4:d1383f2d9b43

more on the tests and the framework towards the viewer
author wobin
date Fri, 17 Apr 2009 20:42:31 +1000
parents 1cc6e4710e2e
children 50ef3ed9d0da
rev   line source
wobin@0 1 -- A Twitter client of sorts for World of Warcraft
wobin@0 2 -- Author: Wobin
wobin@0 3 -- Email: wobster@gmail.com
wobin@0 4 --
wobin@1 5 Squawk = LibStub("AceAddon-3.0"):NewAddon("Squawk")
wobin@0 6
wobin@0 7 Squawk.Model = {}
wobin@0 8 Squawk.View = {}
wobin@0 9 Squawk.Controller = {}
wobin@0 10
wobin@0 11 local Model = Squawk.Model
wobin@0 12 local View = Squawk.View
wobin@0 13 local Controller = Squawk.Controller
wobin@0 14
wobin@0 15 Model.UserSettings = {}
wobin@0 16 local Settings = Model.UserSettings
wobin@0 17
wobin@0 18 local defaults = {
wobin@0 19 profile = {
wobin@0 20 Squawks = {},
wobin@0 21 Follower = {},
wobin@0 22 Following = {},
wobin@0 23 Blocked = {},
wobin@0 24 }
wobin@0 25 }
wobin@0 26
wobin@0 27 function Squawk:OnInitialize()
wobin@0 28 Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults)
wobin@4 29 Model.Squawks = Model.db.profile.Squawks
wobin@0 30 Settings.Follower = Model.db.profile.Follower
wobin@0 31 Settings.Following = Model.db.profile.Following
wobin@0 32 Settings.Blocked = Model.db.profile.Blocked
wobin@0 33 Settings.Private = Model.db.profile.Private
wobin@0 34
wobin@0 35 LibStub("AceComm-3.0"):Embed(Controller)
wobin@3 36 Controller:RegisterComm("Squawk", Controller.ReceiveMessage)
wobin@3 37
wobin@3 38 LibStub("AceConsole-3.0"):Embed(View)
wobin@0 39 end
wobin@0 40
wobin@0 41 -- Model --
wobin@0 42 --[[
wobin@0 43 --Each Squawk will have the following information:
wobin@0 44 -- * Owner (Name)
wobin@0 45 -- * Time (Epoch)
wobin@0 46 -- * Message (140 characters)
wobin@0 47 -- * ReplyTo (Name)
wobin@0 48 -- * Related (Names)
wobin@0 49 --
wobin@0 50 -- Each User will have the following lists:
wobin@0 51 -- * Follower
wobin@0 52 -- * Following
wobin@0 53 -- * Blocked
wobin@0 54 -- * Privacy State
wobin@0 55 --]]
wobin@0 56 Model.Squawk = {}
wobin@0 57 local Squawk = Model.Squawk
wobin@0 58
wobin@0 59 function Squawk:new(Message, Owner)
wobin@0 60 local o = {}
wobin@0 61 o.Owner = Owner or UnitName("player")
wobin@0 62 o.Message = Message
wobin@0 63 o.Time = os.time()
wobin@0 64 local reply, to = strsplit("@", ((strsplit(" ", Message))))
wobin@0 65 if reply == "" then
wobin@0 66 o.ReplyTo = to
wobin@0 67 end
wobin@0 68
wobin@0 69 o.Related = {}
wobin@0 70
wobin@0 71 for word in string.gmatch(Message, "@(%a+)") do
wobin@0 72 if word ~= o.ReplyTo or "" then
wobin@0 73 table.insert(o.Related, word)
wobin@0 74 end
wobin@0 75 end
wobin@0 76
wobin@0 77 return o
wobin@0 78 end
wobin@0 79
wobin@0 80 function Squawk:Sort(Squawks)
wobin@0 81 return table.sort(Squawks, function(a,b) return a.Time < b.Time end)
wobin@0 82 end
wobin@0 83
wobin@2 84 function Squawk:GetOwn(Squawks)
wobin@2 85 local mine = {}
wobin@2 86 for _, squawk in ipairs(Squawks) do
wobin@2 87 if squawk.Owner == UnitName("player") then
wobin@2 88 table.insert(mine, squawk)
wobin@2 89 end
wobin@2 90 end
wobin@2 91 return self:Sort(mine)
wobin@2 92 end
wobin@2 93
wobin@0 94 function Settings:IsPrivate()
wobin@0 95 return Settings.Private
wobin@0 96 end
wobin@0 97
wobin@0 98 function Settings:AddFollower(Name)
wobin@2 99 Settings.Follower[Name] = 1
wobin@0 100 end
wobin@0 101
wobin@0 102 function Settings:AddFollowing(Name)
wobin@2 103 Settings.Following[Name] = 1
wobin@0 104 end
wobin@0 105
wobin@0 106 function Settings:AddBlock(Name)
wobin@2 107 Settings.Blocked[Name] = 1
wobin@0 108 end
wobin@0 109
wobin@0 110 function Settings:RemoveFollower(Name)
wobin@2 111 if Settings.Follower[Name] then
wobin@2 112 Settings.Follower[Name] = nil
wobin@0 113 end
wobin@0 114 end
wobin@0 115
wobin@0 116 function Settings:RemoveFollowing(Name)
wobin@2 117 if Settings.Following[Name] then
wobin@2 118 Settings.Following[Name] = nil
wobin@0 119 end
wobin@0 120 end
wobin@0 121
wobin@0 122 function Settings:RemoveBlock(Name)
wobin@2 123 if Settings.Blocked[Name] then
wobin@2 124 Settings.Blocked[Name] = nil
wobin@0 125 end
wobin@0 126 end
wobin@0 127
wobin@0 128 --Controller--
wobin@0 129
wobin@0 130 function Controller:TheyWantToFollowMe(Name)
wobin@0 131 if Settings:IsPrivate() then
wobin@0 132 self:PutForwardFollowRequest(Name)
wobin@0 133 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
wobin@0 134 else
wobin@0 135 Settings:AddFollower(Name)
wobin@0 136 View:NotifyOfNewFollower(Name)
wobin@0 137 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
wobin@0 138 end
wobin@0 139 end
wobin@0 140
wobin@0 141 function Controller:IWantToFollowThem(Name)
wobin@2 142 self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
wobin@0 143 end
wobin@0 144
wobin@0 145 function Controller:IAmNowFollowingThem(Name)
wobin@0 146 Settings:AddFollowing(Name)
wobin@0 147 View:NotifyOfNewFollowing(Name)
wobin@0 148 end
wobin@0 149
wobin@0 150 function Controller:AddANewSquawk(Name, Message)
wobin@4 151 table.insert(Model.Squawks, Squawk:new(Message, Name))
wobin@0 152 View:UpdateSquawkList()
wobin@0 153 end
wobin@0 154
wobin@2 155 function Controller:SendNewSquawk(Message)
wobin@2 156 if not Model:IsPrivate() then
wobin@2 157 self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
wobin@2 158 end
wobin@2 159
wobin@2 160 self:AddANewSquawk(UnitName("player"), Message)
wobin@2 161
wobin@2 162 for name, _ in pairs(Model.Following) do
wobin@2 163 self:SendMessageToTarget(name, "#Squawk|"..UnitName("player").."|"..Message)
wobin@2 164 end
wobin@2 165 end
wobin@2 166
wobin@1 167 function Controller:ImPending(Name)
wobin@1 168 View:NotifyOfPending(Name)
wobin@1 169 end
wobin@1 170
wobin@0 171 function Controller:SendMessageToTarget(Name, Message)
wobin@0 172 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
wobin@0 173 end
wobin@0 174
wobin@0 175 function Controller:SendMessageToGuild(Message)
wobin@0 176 self:SendCommMessage("Squawk", Message, "GUILD")
wobin@0 177 end
wobin@0 178
wobin@0 179 local Parse = {
wobin@1 180 ["#Pending"] = Controller.ImPending,
wobin@1 181 ["#Follow"] = Controller.IAmNowFollowingThem,
wobin@2 182 ["#Squawk"] = Controller.AddANewSquawk,
wobin@2 183 ["#Request"] = Controller.TheyWantToFollowMe,
wobin@0 184 }
wobin@0 185
wobin@0 186 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
wobin@0 187 local command, name, info = strsplit("|",Message)
wobin@1 188 Parse[command](self, name, info)
wobin@0 189 end
wobin@0 190 -- View --
wobin@0 191
wobin@0 192 function View:UpdateSquawkList()
wobin@3 193 self:Print("Updated Squawk List")
wobin@4 194 self:ShowMeMySquawks()
wobin@0 195 end
wobin@0 196
wobin@3 197 function View:NotifyOfPending(Name)
wobin@3 198 self:Print(Name.." will have to approve your request")
wobin@0 199 end
wobin@0 200
wobin@0 201 function View:NotifyOfNewFollowing(Name)
wobin@3 202 self:Print("You are now following "..Name)
wobin@0 203 end
wobin@0 204
wobin@0 205 function View:NotifyOfNewFollower(Name)
wobin@3 206 self:Print(Name.." is now following you")
wobin@0 207 end
wobin@4 208
wobin@4 209 function View:ShowMeMySquawks()
wobin@4 210 for _,squawk from ipairs(Model.Squawks) do
wobin@4 211 self:Print(squawk.Message)
wobin@4 212 end
wobin@4 213 end
wobin@4 214
wobin@4 215 function View:ShowMeMyFollowers()
wobin@4 216 self:Print("My followers are:")
wobin@4 217 for name,_ in pairs(Settings.Follower) do
wobin@4 218 self:Print(name)
wobin@4 219 end
wobin@4 220 end
wobin@4 221
wobin@4 222 function View:ShowMeWhoImFollowing()
wobin@4 223 self:Print("I am following:")
wobin@4 224 for name,_ in pairs(Settings.Following) do
wobin@4 225 self:Print(name)
wobin@4 226 end
wobin@4 227 end
wobin@4 228
wobin@4 229 function View:ShowMeWhoIveBlocked()
wobin@4 230 self:Print("I've blocked:")
wobin@4 231 for name, in pairs(Settings.Blocked) do
wobin@4 232 self:Print(name)
wobin@4 233 end
wobin@4 234 end