Mercurial > wow > breuesk
comparison Comm.lua @ 96:082ff877c443
Small refactor
| author | John@Doomsday |
|---|---|
| date | Mon, 23 Apr 2012 09:11:21 -0400 |
| parents | 2058d86778b4 |
| children | 19fd02bff870 |
comparison
equal
deleted
inserted
replaced
| 95:5df2c9cdb8c8 | 96:082ff877c443 |
|---|---|
| 81 end, | 81 end, |
| 82 | 82 |
| 83 ["TS"] = function(self,packet,sender,isloop) | 83 ["TS"] = function(self,packet,sender,isloop) |
| 84 if isloop then return end | 84 if isloop then return end |
| 85 if masterLooterIsMe and admin then | 85 if masterLooterIsMe and admin then |
| 86 -- only non-admins will send this message, send them the present | 86 -- only non-admins will send this message |
| 87 -- working state | |
| 88 | 87 |
| 89 local t = packet | 88 local t = packet |
| 90 local remoteBase = table.remove(t,1) | 89 local remoteBase = table.remove(t,1) |
| 91 | 90 |
| 92 -- if their base is older than ours, this is easy - send them our | 91 -- if their base is older than ours, this is easy - send them our |
| 98 -- admin rebased and we aren't aware of that. but the other admin | 97 -- admin rebased and we aren't aware of that. but the other admin |
| 99 -- wouldn't have done that if they didn't believe all the admins | 98 -- wouldn't have done that if they didn't believe all the admins |
| 100 -- were synced up to the release point. So do we trust that and use | 99 -- were synced up to the release point. So do we trust that and use |
| 101 -- this as a rebase opportunity? print an error? just reply that we | 100 -- this as a rebase opportunity? print an error? just reply that we |
| 102 -- don't have anything new to share with them? only send them | 101 -- don't have anything new to share with them? only send them |
| 103 -- | |
| 104 | 102 |
| 105 if remoteBase == db.profile.time then | 103 local success, o = CreateChangeDiff(remoteBase,t) |
| 106 local j = 1 -- index in foreign list | 104 if success and getn(o) > 0 then |
| 107 local n = getn(t) | 105 Send("CU",o) |
| 108 local o = {} | 106 end |
| 109 for i,v in pairs(db.profile.changes) do -- for each timestamp in our list | 107 if not success then -- push |
| 110 if t and t[j] < v.time then | |
| 111 table.insert(o,v) | |
| 112 end | |
| 113 while j<n and t[j] <= v.time do j = j+1 end -- advance the foreign pointer past our current entry | |
| 114 end -- j>=n ? add because the remote hit end of road. lt? add because it's a missing stamp | |
| 115 print("Received request at timebase",remoteBase,"and returning:") | |
| 116 PrintTable(o) | |
| 117 if getn(o) > 0 then | |
| 118 Send("CU",o) -- todo: send privately to the requster | |
| 119 end | |
| 120 else | |
| 121 print("Received request at differing timebase",remoteBase,db.profile.time," ... pushing") | 108 print("Received request at differing timebase",remoteBase,db.profile.time," ... pushing") |
| 122 self:Push() -- todo: send privately to requester | 109 self:Push() -- todo: send privately to requester |
| 123 end | 110 end |
| 124 end | 111 end |
| 125 end, | 112 end, |
| 126 | 113 |
| 127 ["CU"] = function(self,packet,sender,isloop) -- blindly trust an admin loot master | 114 ["CU"] = function(self,packet,sender,isloop) -- blindly trust an admin loot master |
| 128 if isloop then return end | 115 if isloop then return end |
| 129 | 116 IntegrateChangeDiff(packet) |
| 130 local c = packet | |
| 131 local old = db.profile.changes | |
| 132 | |
| 133 local new = {} | |
| 134 | |
| 135 local op = 1 | |
| 136 local cp = 1 | |
| 137 | |
| 138 local no = getn(old) | |
| 139 local nc = getn(c) | |
| 140 | |
| 141 if no == 0 then | |
| 142 db.profile.changes = c | |
| 143 else | |
| 144 while op <= no or cp <= nc do -- lists are pre-sorted. insertion merge them | |
| 145 if cp > nc then -- inelegant | |
| 146 table.insert(new,old[op]) | |
| 147 op = op + 1 | |
| 148 elseif op > no then | |
| 149 table.insert(new,c[cp]) | |
| 150 cp = cp + 1 | |
| 151 elseif c[cp].time < old[op].time then | |
| 152 table.insert(new,c[cp]) | |
| 153 cp = cp + 1 | |
| 154 elseif c[cp].time > old[op].time then | |
| 155 table.insert(new,old[op]) | |
| 156 op = op + 1 | |
| 157 else | |
| 158 error("Bad update received from ",sender) | |
| 159 end | |
| 160 end | |
| 161 print("Updating changes - ",getn(new), "entries") | |
| 162 db.profile.changes = new | |
| 163 end | |
| 164 | |
| 165 CreateWorkingStateFromChanges(db.profile.changes) | |
| 166 if changeListener then | |
| 167 changeListener:DataEvent() | |
| 168 end | |
| 169 end, | 117 end, |
| 170 | 118 |
| 171 ["RequestCatchup"] = function(self) | 119 ["RequestCatchup"] = function(self) |
| 172 if not admin then | 120 if not admin then |
| 173 --local string = _g.tostring(timestamp) | 121 --local string = _g.tostring(timestamp) |
