Mercurial > wow > squawk
comparison Model.lua @ 18:a3328fffef5c
Split of main file into components
| author | wobin |
|---|---|
| date | Thu, 07 May 2009 02:52:23 +1000 |
| parents | |
| children | 431f2fce08f2 |
comparison
equal
deleted
inserted
replaced
| 17:2a73deb7bc54 | 18:a3328fffef5c |
|---|---|
| 1 local Model = Squawk.Model | |
| 2 local Settings = Model.UserSettings | |
| 3 local Controller = Squawk.Controller | |
| 4 local View = Squawk.View | |
| 5 | |
| 6 | |
| 7 -- Model -- | |
| 8 --[[ | |
| 9 --Each Squawk will have the following information: | |
| 10 -- * Owner (Name) | |
| 11 -- * Time (Epoch) | |
| 12 -- * Message (140 characters) | |
| 13 -- * ReplyTo (Name) | |
| 14 -- * Related (Names) | |
| 15 -- | |
| 16 -- Each User will have the following lists: | |
| 17 -- * Follower | |
| 18 -- * Following | |
| 19 -- * Blocked | |
| 20 -- * Pending (Requests to follow that you haven't acted on) | |
| 21 -- * Requested (Requests to follow that you have made) | |
| 22 -- * Privacy State | |
| 23 -- | |
| 24 -- A user can only request to follow an online person. Requests can be approved | |
| 25 -- on or offline, but the initial request must be made online. | |
| 26 -- | |
| 27 -- When a user makes a request to follow a private user, the subsequent paths occur: | |
| 28 -- - Followee is added to Settings.Requested | |
| 29 -- - Followee receives 'follow request' -> (their) Settings.Pending | |
| 30 -- - Followee acts on request -> (their) Settings.Pending cleared | |
| 31 -- 1) Follwer is online | |
| 32 -- - Follower receives 'request accepted' -> Added to Settings.Following and | |
| 33 -- cleared from Settings.Requested | |
| 34 -- 2) Follower is offline | |
| 35 -- - The next time Follower is online and recieves a Squawk we check if there | |
| 36 -- is a Settings.Requested for that name, and if so assume they have approved | |
| 37 -- and clear/add records appropriately. | |
| 38 -- | |
| 39 -- For updating, there can be a few methods. | |
| 40 -- | |
| 41 -- Guild open: you're not private, you broadcast to the guild your last X | |
| 42 -- squawks on login | |
| 43 -- | |
| 44 -- followers: | |
| 45 --]] | |
| 46 Model.Squawks = {} | |
| 47 local Squawks = Model.Squawks | |
| 48 Squawks.Main = {} | |
| 49 Squawks.Owners = {} | |
| 50 | |
| 51 local function wrap(str, limit) | |
| 52 limit = limit or 72 | |
| 53 local here = 1 | |
| 54 return str:gsub("(%s+)()(%S+)()", | |
| 55 function(sp, st, word, fi) | |
| 56 if fi-here > limit then | |
| 57 here = st | |
| 58 return "\n"..word | |
| 59 end | |
| 60 end) | |
| 61 end | |
| 62 | |
| 63 function Squawks:new(Message, Owner) | |
| 64 local o = {} | |
| 65 o.Owner = Owner or UnitName("player") | |
| 66 o.Message = wrap(Message) | |
| 67 o.Time = time() | |
| 68 local reply, to = strsplit("@", ((strsplit(" ", Message)))) | |
| 69 if reply == "" then | |
| 70 o.ReplyTo = to | |
| 71 end | |
| 72 | |
| 73 o.Related = {} | |
| 74 | |
| 75 for word in string.gmatch(Message, "@(%a+)") do | |
| 76 if word ~= o.ReplyTo or "" then | |
| 77 table.insert(o.Related, word) | |
| 78 end | |
| 79 end | |
| 80 | |
| 81 if #o.Related == 0 then | |
| 82 o.Related = nil | |
| 83 end | |
| 84 | |
| 85 table.insert(self.Main, o) | |
| 86 | |
| 87 if not self.Owners[Owner] then | |
| 88 self.Owners[Owner] = {} | |
| 89 end | |
| 90 table.insert(self.Owners[Owner], o) | |
| 91 return o | |
| 92 end | |
| 93 | |
| 94 function Squawks:Reload() | |
| 95 for _,squawk in ipairs(Model.Squawks.Main) do | |
| 96 if not self.Owners[squawk.Owner] then | |
| 97 self.Owners[squawk.Owner] = {} | |
| 98 end | |
| 99 table.insert(self.Owners[squawk.Owner], squawk) | |
| 100 if squawk.Related and #squawk.Related == 0 then | |
| 101 squawk.Related = nil | |
| 102 end | |
| 103 end | |
| 104 end | |
| 105 | |
| 106 function Squawks:Sort(Squawks) | |
| 107 table.sort(Squawks or self.Main, function(a,b) return a.Time > b.Time end) | |
| 108 return Squawks or self.Main | |
| 109 end | |
| 110 | |
| 111 function Squawks:GetOwn(Squawks) | |
| 112 local mine = {} | |
| 113 for _, squawk in ipairs(Squawks or self.Main) do | |
| 114 if squawk.Owner == UnitName("player") then | |
| 115 table.insert(mine, squawk) | |
| 116 end | |
| 117 end | |
| 118 return self:Sort(mine) | |
| 119 end | |
| 120 | |
| 121 function Squawks:GetLast10(Squawks) | |
| 122 local mine = {} | |
| 123 Squawks = Squawks or self.Main | |
| 124 local limit = #Squawks < 10 and #Squawks or 10 | |
| 125 | |
| 126 Squawks = self:Sort(Squawks) | |
| 127 | |
| 128 for i=1,limit do | |
| 129 table.insert(mine, Squawks[i]) | |
| 130 end | |
| 131 return mine | |
| 132 end | |
| 133 | |
| 134 -- initially called with no arguments to get the latest timestamp of | |
| 135 -- my squawks, or with a name to find the latest timestamp of all | |
| 136 -- squawks from that user | |
| 137 function Squawks:GetLatestTimestamp(Name, Squawks) | |
| 138 if Name then | |
| 139 if self.Owners[Name] then | |
| 140 return self:GetLatestTimestamp(nil, self.Owners[Name]) | |
| 141 else | |
| 142 return -1 -- No squawks exist for that name in our records | |
| 143 end | |
| 144 end | |
| 145 | |
| 146 Squawks = Squawks or self.Main or {} | |
| 147 local latest = self:Sort(Squawks) | |
| 148 return latest and #latest > 0 and latest[1].Time or -1 | |
| 149 end | |
| 150 | |
| 151 function Squawks:GetLatestSquawks(Timestamp) | |
| 152 local latest = {} | |
| 153 for i, squawk in ipairs(self:Sort()) do | |
| 154 if squawk.Time > Timestamp and i < 10 then | |
| 155 table.insert(latest, squawk) | |
| 156 else | |
| 157 return latest | |
| 158 end | |
| 159 end | |
| 160 end | |
| 161 | |
| 162 function Settings:IsPrivate() | |
| 163 return Settings.Private | |
| 164 end | |
| 165 | |
| 166 function Settings:TogglePrivate() | |
| 167 Settings.Private = not Settings.Private | |
| 168 end | |
| 169 | |
| 170 function Settings:AddFollower(Name) | |
| 171 Settings.Follower[Name] = 1 | |
| 172 self:RemovePending(Name) | |
| 173 end | |
| 174 | |
| 175 function Settings:AddFollowing(Name) | |
| 176 Settings.Following[Name] = 1 | |
| 177 self:RemoveRequested(Name) | |
| 178 end | |
| 179 | |
| 180 function Settings:AddBlock(Name) | |
| 181 Settings.Blocked[Name] = 1 | |
| 182 self:RemoveFollower(Name) | |
| 183 self:RemoveFollowing(Name) | |
| 184 end | |
| 185 | |
| 186 function Settings:AddPending(Name) | |
| 187 Settings.Pending[Name] = 1 | |
| 188 end | |
| 189 | |
| 190 function Settings:AddRequested(Name) | |
| 191 Settings.Requested[Name] = 1 | |
| 192 end | |
| 193 | |
| 194 function Settings:RemoveFollower(Name) | |
| 195 if Settings.Follower[Name] then | |
| 196 Settings.Follower[Name] = nil | |
| 197 end | |
| 198 end | |
| 199 | |
| 200 function Settings:RemoveFollowing(Name) | |
| 201 if Settings.Following[Name] then | |
| 202 Settings.Following[Name] = nil | |
| 203 end | |
| 204 end | |
| 205 | |
| 206 function Settings:RemoveBlock(Name) | |
| 207 if Settings.Blocked[Name] then | |
| 208 Settings.Blocked[Name] = nil | |
| 209 end | |
| 210 end | |
| 211 | |
| 212 function Settings:RemovePending(Name) | |
| 213 if Settings.Pending[Name] then | |
| 214 Settings.Pending[Name] = nil | |
| 215 end | |
| 216 end | |
| 217 | |
| 218 function Settings:RemoveRequested(Name) | |
| 219 if Settings.Requested[Name] then | |
| 220 Settings.Requested[Name] = nil | |
| 221 end | |
| 222 end |
