Mercurial > wow > breuesk
comparison Lists.lua @ 8:b05fcb225c4a
player -> person
fix trim bug when trimming all
shortened IDs for persons list keys
author | John@Yosemite-PC |
---|---|
date | Wed, 07 Mar 2012 00:18:05 -0500 |
parents | 241986f7066c |
children | daed0597deba |
comparison
equal
deleted
inserted
replaced
7:241986f7066c | 8:b05fcb225c4a |
---|---|
41 -- ordering. Then the next 5, etc. | 41 -- ordering. Then the next 5, etc. |
42 -- | 42 -- |
43 -- Handling conflicts: | 43 -- Handling conflicts: |
44 -- | 44 -- |
45 | 45 |
46 -- todo: list-of-lists must not use int indices. those will lead to peril. | |
46 bsk.lists = {} | 47 bsk.lists = {} |
47 bsk.players = {} | 48 bsk.persons = {} |
48 | 49 |
49 local RaidList = {} | 50 local raidList = {} |
50 local ReserveList = {} | 51 local reserveList = {} |
51 local activeList = 0 -- temporary | 52 local activeListKey = 1 -- temporary |
53 local personsReverse = {} | |
52 | 54 |
53 local tinsert = table.insert | 55 local tinsert = table.insert |
54 local sformat = string.format | 56 local sformat = string.format |
55 local getn = table.getn | 57 local getn = table.getn |
56 | 58 |
75 bsk:PrintTable(bsk.lists) | 77 bsk:PrintTable(bsk.lists) |
76 end | 78 end |
77 function bsk:PrintChanges() | 79 function bsk:PrintChanges() |
78 bsk:PrintTable(bsk.db.profile.changes) | 80 bsk:PrintTable(bsk.db.profile.changes) |
79 end | 81 end |
80 function bsk:PrintPlayers() | 82 function bsk:PrintPersons() |
81 bsk:PrintTable(bsk.players) | 83 bsk:PrintTable(bsk.persons) |
82 end | 84 end |
83 function bsk:PrintTable(table, depth) | 85 function bsk:PrintTable(table, depth) |
84 depth = depth or "" | 86 depth = depth or "" |
85 if not table then return end | 87 if not table then return end |
86 for i,v in pairs(table) do | 88 for i,v in pairs(table) do |
100 end | 102 end |
101 | 103 |
102 --}}} | 104 --}}} |
103 | 105 |
104 function bsk:CreateWorkingStateFromChanges(changes) | 106 function bsk:CreateWorkingStateFromChanges(changes) |
105 local playerBase = self.db.profile.players | 107 local personsBase = self.db.profile.persons |
106 local listBase = self.db.profile.listBase | 108 local listBase = self.db.profile.listBase |
107 | 109 |
108 -- copy the base to the working state | 110 -- copy the base to the working state |
109 wipe(bsk.lists) | 111 wipe(bsk.lists) |
110 wipe(bsk.players) | 112 wipe(bsk.persons) |
113 wipe(personsReverse) | |
114 | |
111 bsk:tcopy(bsk.lists,listBase) | 115 bsk:tcopy(bsk.lists,listBase) |
112 bsk:tcopy(bsk.players,playerBase) | 116 bsk:tcopy(bsk.persons,personsBase) |
113 | 117 |
114 -- now just go through the changes list applying each | 118 -- now just go through the changes list applying each |
115 for i,v in ipairs(changes) do | 119 for i,v in ipairs(changes) do |
116 bsk:ProcessChange(v) | 120 bsk:ProcessChange(v) |
117 end | 121 end |
173 -- timestamp check. Issue warnings for anyone with a clock that's more than | 177 -- timestamp check. Issue warnings for anyone with a clock that's more than |
174 -- X seconds out of sync with the others. Seriously, why isn't NTP a standard | 178 -- X seconds out of sync with the others. Seriously, why isn't NTP a standard |
175 -- setting on all operating systems ... | 179 -- setting on all operating systems ... |
176 | 180 |
177 function bsk:ProcessChange(change) | 181 function bsk:ProcessChange(change) |
178 if change.action == "AddPlayer" then | 182 if change.action == "AddPerson" then |
179 bsk:DoAddPlayer(change) | 183 bsk:DoAddPerson(change) |
180 elseif change.action == "CreateList" then | 184 elseif change.action == "CreateList" then |
181 bsk:DoCreateList(change) | 185 bsk:DoCreateList(change) |
182 elseif change.action == "AddPlayerToList" then | 186 elseif change.action == "AddPersonToList" then |
183 bsk:DoAddPlayerToList(change) | 187 bsk:DoAddPersonToList(change) |
184 elseif change.action == "SuicidePlayer" then | 188 elseif change.action == "SuicidePerson" then |
185 bsk:DoSuicidePlayer(change) | 189 bsk:DoSuicidePerson(change) |
186 else | 190 else |
187 bsk:Print("Unknown message encountered") | 191 bsk:Print("Unknown message encountered") |
188 bsk:PrintTable(change) | 192 bsk:PrintTable(change) |
189 assert(false) | 193 assert(false) |
190 end | 194 end |
206 -- routines. | 210 -- routines. |
207 -- | 211 -- |
208 -- Note that "undo" has no special voodoo to it. It's basically a change that | 212 -- Note that "undo" has no special voodoo to it. It's basically a change that |
209 -- reverses the prior change on the stack. | 213 -- reverses the prior change on the stack. |
210 | 214 |
211 -- Players list | 215 -- persons list |
212 function bsk:DoAddPlayer(change) | 216 function bsk:DoAddPerson(change) |
213 assert(change) | 217 assert(change) |
214 assert(change.arg.guid) | 218 assert(change.arg.id) |
215 local arg = change.arg | 219 local arg = change.arg |
216 -- require admin | 220 -- require admin |
217 local players = bsk.players | 221 local persons = bsk.persons |
218 local name = arg.name | 222 local name = arg.name |
219 local guid = arg.guid | 223 local id = arg.id |
220 assert(players[guid]==nil) | 224 assert(persons[id]==nil) |
221 players[guid] = name | 225 persons[id] = {main=name} |
222 players.time=change.time | 226 persons.time=change.time |
227 personsReverse[name] = id | |
223 return true | 228 return true |
224 end | 229 end |
225 | 230 |
226 function bsk:AddPlayer(name) | 231 function bsk:AddPerson(name) |
227 local players = bsk.players | 232 local persons = bsk.persons |
228 local guid = UnitGUID(name) | 233 local guid = UnitGUID(name) |
229 -- TODO: check guid to be sure it's a player | 234 -- TODO: check guid to be sure it's a player |
230 if not guid then | 235 if not guid then |
231 self:Print(sformat("Could not add player %s - they must be in range or group",name)) | 236 self:Print(sformat("Could not add player %s - they must be in range or group",name)) |
232 return | 237 return |
233 end | 238 end |
234 if players[guid] and players[guid] ~= name then | 239 local id = string.sub(guid,6) -- skip at least 0x0580 ... |
235 self:Print(sformat("Namechange detected for %s - new is %s, please rename the existing entry", players[guid], name)) | 240 id = id:gsub("^0*(.*)","%1") -- nom all leading zeroes remaining |
241 | |
242 if persons[id] and persons[id] ~= name then | |
243 self:Print(sformat("Namechange detected for %s - new is %s, please rename the existing entry", persons[id], name)) | |
236 return | 244 return |
237 end | 245 end |
238 if players[guid] ~= nil then | 246 if persons[id] ~= nil then |
239 self:Print(sformat("%s is already in the players list; disregarding", name)) | 247 self:Print(sformat("%s is already in the persons list; disregarding", name)) |
240 return | 248 return |
241 end | 249 end |
242 local change = {action="AddPlayer",arg={name=name,guid=guid}} | 250 local change = {action="AddPerson",arg={name=name,id=id}} |
243 if bsk:DoAddPlayer(change) then | 251 if bsk:DoAddPerson(change) then |
244 bsk:CreateChange(change) | 252 bsk:CreateChange(change) |
245 end | 253 end |
246 end | 254 end |
247 | 255 |
248 function bsk:DoCreateList(change) | 256 function bsk:DoCreateList(change) |
266 if bsk:DoCreateList(change) then | 274 if bsk:DoCreateList(change) then |
267 bsk:CommitChange(change) | 275 bsk:CommitChange(change) |
268 end | 276 end |
269 end | 277 end |
270 | 278 |
271 function bsk:DoAddPlayerToList(change) | 279 function bsk:DoAddPersonToList(change) |
272 local listIndex = change.arg.listIndex | 280 local listIndex = change.arg.listIndex |
273 local slist = change.arg.slist | 281 local slist = change.arg.slist |
274 local list = bsk.lists[listIndex] | 282 local list = bsk.lists[listIndex] |
275 | 283 |
276 if #slist == 1 then -- end of list insertion - just one person | 284 if #slist == 1 then -- end of list insertion - just one person |
281 return false | 289 return false |
282 end | 290 end |
283 return true | 291 return true |
284 end | 292 end |
285 | 293 |
286 function bsk:AddPlayerToList(name,list) | 294 function bsk:AddPersonToList(name,list) |
287 -- require admin | 295 -- require admin |
288 local listIndex = bsk:GetListIndex(list) | 296 local listIndex = bsk:GetListIndex(list) |
289 local slist = {name} -- TODO: support adding to elsewhere besides the end | 297 local id = personsReverse[name] |
290 local change = {action="AddPlayerToList",arg={name=name,listIndex=listIndex,slist=slist}} | 298 local slist = {id} -- TODO: support adding to elsewhere besides the end |
299 local change = {action="AddPersonToList",arg={id=id,listIndex=listIndex,slist=slist}} | |
291 bsk:StartChange(change) | 300 bsk:StartChange(change) |
292 if bsk:DoAddPlayerToList(change) then | 301 if bsk:DoAddPersonToList(change) then |
293 bsk:CommitChange(change) | 302 bsk:CommitChange(change) |
294 end | 303 end |
295 end | 304 end |
296 | 305 |
297 function bsk:DoRemovePlayer(change) | 306 function bsk:DoRemovePerson(change) |
298 | 307 |
299 -- return true | 308 -- return true |
300 end | 309 end |
301 | 310 |
302 function bsk:RemovePlayer(name) | 311 function bsk:RemovePerson(name) |
303 -- from both players and lists | 312 -- from both persons and lists |
304 end | 313 end |
305 | 314 |
306 function bsk:DoSuicidePlayer(change) | 315 function bsk:DoSuicidePerson(change) |
307 local listIndex = change.arg.listIndex | 316 local listIndex = change.arg.listIndex |
308 local list = bsk.lists[listIndex] | 317 local list = bsk.lists[listIndex] |
309 local slist = shallowCopy(change.arg.list) | 318 local slist = shallowCopy(change.arg.list) |
310 -- the goal here is to rotate the suicide list by 1 | 319 -- the goal here is to rotate the suicide list by 1 |
311 -- then we can just mash it on top of the intersection between the original | 320 -- then we can just mash it on top of the intersection between the original |
326 --bsk:Print("After") | 335 --bsk:Print("After") |
327 --bsk:PrintTable(list) | 336 --bsk:PrintTable(list) |
328 return true | 337 return true |
329 end | 338 end |
330 | 339 |
331 function bsk:SuicidePlayer(name,list) | 340 function bsk:SuicidePerson(name,list) |
332 -- require admin | 341 -- require admin |
333 bsk:PopulateRaidList() | 342 bsk:PopulateRaidList() |
334 local listIndex = bsk:GetListIndex(list) | 343 local listIndex = bsk:GetListIndex(list) |
335 local slist=bsk:GetSuicideList(name,bsk.lists[listIndex]) | 344 local slist=bsk:GetSuicideList(name,bsk.lists[listIndex]) |
336 local change = {action="SuicidePlayer",arg={names=names,list=slist,listIndex=listIndex}} | 345 local change = {action="SuicidePerson",arg={names=names,list=slist,listIndex=listIndex}} |
337 bsk:StartChange(change) | 346 bsk:StartChange(change) |
338 if bsk:DoSuicidePlayer(change) then | 347 if bsk:DoSuicidePerson(change) then |
339 bsk:CommitChange(change) | 348 bsk:CommitChange(change) |
340 end | 349 end |
341 end | 350 end |
342 | 351 |
343 function bsk:TrimLists(time) | 352 function bsk:TrimLists(time) |
363 | 372 |
364 -- apply first half | 373 -- apply first half |
365 bsk:CreateWorkingStateFromChanges(before) | 374 bsk:CreateWorkingStateFromChanges(before) |
366 | 375 |
367 -- save this state permanently; trim the changes permanently | 376 -- save this state permanently; trim the changes permanently |
368 bsk:tcopy(bsk.db.profile.players,bsk.players) | 377 bsk:tcopy(bsk.db.profile.persons,bsk.persons) |
369 bsk:tcopy(bsk.db.profile.listBase,bsk.lists) | 378 bsk:tcopy(bsk.db.profile.listBase,bsk.lists) |
370 while bsk.db.profile.changes[1].time <= time do | 379 while bsk.db.profile.changes ~= nil and bsk.db.profile.changes[1] ~= nil and bsk.db.profile.changes[1].time <= time do |
371 table.remove(bsk.db.profile.changes,1) | 380 table.remove(bsk.db.profile.changes,1) |
372 end | 381 end |
373 | 382 |
374 -- using the trimmed list and the new bases, recreate the working state | 383 -- using the trimmed list and the new bases, recreate the working state |
375 bsk:CreateWorkingStateFromChanges(bsk.db.profile.changes) | 384 bsk:CreateWorkingStateFromChanges(bsk.db.profile.changes) |
376 end | 385 end |
377 | 386 |
378 --}}} | 387 --}}} |
379 -- Higher order actions (ie calls other Doers){{{ | 388 -- Higher order actions (ie calls other Doers){{{ |
380 function bsk:AddMissingPlayers() | 389 function bsk:AddMissingPersons() |
381 bsk:PopulateRaidList() | 390 bsk:PopulateRaidList() |
382 local t = {} | 391 local t = {} |
383 for i,v in pairs(bsk.players) do | 392 for _,v in pairs(bsk.persons) do |
384 t[v] = true | 393 t[v.main] = true |
385 end | 394 -- TODO: also add alts here |
386 for i,v in pairs(RaidList) do | 395 end |
396 for i,_ in pairs(raidList) do | |
387 if t[i] == nil then | 397 if t[i] == nil then |
388 bsk:Print(sformat("Player %s is missing from the players list - adding",i)) | 398 bsk:Print(sformat("Person %s is missing from the persons list - adding",i)) |
389 bsk:AddPlayer(i) | 399 bsk:AddPerson(i) |
390 end | 400 end |
391 end | 401 end |
392 -- TODO: batch into a single op - no need to spam 25 messages in a row | 402 -- TODO: batch into a single op - no need to spam 25 messages in a row |
393 end | 403 end |
394 function bsk:PopulateListRandom(index) | 404 function bsk:PopulateListRandom(index) |
396 bsk:PopulateRaidList() | 406 bsk:PopulateRaidList() |
397 local list = bsk.lists[index] | 407 local list = bsk.lists[index] |
398 | 408 |
399 local t = {} | 409 local t = {} |
400 --for i = 1,#list do | 410 --for i = 1,#list do |
401 -- if not (RaidList(list[i]) or ReserveList(list[i])) then | 411 -- if not (raidList(list[i]) or reserveList(list[i])) then |
402 -- tinsert(t,) | 412 -- tinsert(t,) |
403 -- end | 413 -- end |
404 --end | 414 --end |
405 end | 415 end |
406 --}}} | 416 --}}} |
407 | 417 |
408 -- "Soft" actions- ie things that cause nonpermanent state {{{ | 418 -- "Soft" actions- ie things that cause nonpermanent state {{{ |
409 | 419 |
410 -- reserves | 420 -- reserves |
411 function bsk:AddReserve(name) | 421 function bsk:AddReserve(name) |
412 ReserveList[name]=true | 422 reserveList[name]=true |
413 -- TODO: communicate to others. don't store this in any way. | 423 -- TODO: communicate to others. don't store this in any way. |
414 end | 424 end |
415 | 425 |
416 function bsk:RemoveReserve(name) | 426 function bsk:RemoveReserve(name) |
417 ReserveList[name]=false | 427 reserveList[name]=false |
418 -- TODO: communicate to others. don't store this in any way. | 428 -- TODO: communicate to others. don't store this in any way. |
419 end | 429 end |
420 | 430 |
421 | 431 |
422 --function bsk:GetActiveList() | 432 --function bsk:GetActiveList() |
437 end | 447 end |
438 function bsk:PopulateRaidList() | 448 function bsk:PopulateRaidList() |
439 local inParty = GetNumPartyMembers() | 449 local inParty = GetNumPartyMembers() |
440 local inRaid = GetNumRaidMembers() | 450 local inRaid = GetNumRaidMembers() |
441 | 451 |
442 wipe(RaidList) | 452 wipe(raidList) |
443 if inRaid > 0 then | 453 if inRaid > 0 then |
444 for i = 1, inRaid do | 454 for i = 1, inRaid do |
445 RaidList[UnitName(rID[i])]=true | 455 raidList[UnitName(rID[i])]=true |
446 end | 456 end |
447 elseif inParty > 0 then | 457 elseif inParty > 0 then |
448 for i = 1, inParty do | 458 for i = 1, inParty do |
449 RaidList[UnitName(pID[i])]=true | 459 raidList[UnitName(pID[i])]=true |
450 end | 460 end |
451 -- Now add yourself as the last party member | 461 -- Now add yourself as the last party member |
452 RaidList[UnitName("player")]=true | 462 raidList[UnitName("player")]=true |
453 else | 463 else |
454 -- You're alone | 464 -- You're alone |
455 RaidList[UnitName("player")]=true | 465 raidList[UnitName("player")]=true |
456 end | 466 end |
457 end | 467 end |
458 | 468 |
459 -- undo rules! | 469 -- undo rules! |
460 -- only the most recent event can be undone | 470 -- only the most recent event can be undone |
473 local pushing = false | 483 local pushing = false |
474 for i = 1, #list do | 484 for i = 1, #list do |
475 if list[i] == name then | 485 if list[i] == name then |
476 pushing = true | 486 pushing = true |
477 end | 487 end |
478 if pushing and (RaidList[list[i]] or ReserveList[list[i]]) then | 488 if pushing and (raidList[list[i]] or reserveList[list[i]]) then |
479 tinsert(ret,list[i]) | 489 tinsert(ret,list[i]) |
480 end | 490 end |
481 end | 491 end |
482 return ret | 492 return ret |
483 end | 493 end |