in rotation.py [0:0]
def generate_rotation(leaders, rotations):
leader_candidates = leaders.copy()
sheriff_candidates = MEMBERS.copy()
# remove recent leaders from pool
for w, r in list(sorted(rotations.items()))[(len(leaders) // 2) * -1 :]:
if r.leader in leader_candidates:
logger.debug(f"Removing {r.leader} from leader pool because they led on {w}")
leader_candidates.remove(r.leader)
# remove recent sheriffs from pools
for w, r in list(sorted(rotations.items()))[-4:]:
if r.leader in sheriff_candidates:
logger.debug(f"Removing {r.leader} from sheriff pool because they sheriffed on {w}")
sheriff_candidates.remove(r.leader)
for sheriff in r.sheriffs:
if sheriff in leader_candidates:
logger.debug(f"Removing {sheriff} from leader pool because they sheriffed on {w}")
leader_candidates.remove(sheriff)
if sheriff in sheriff_candidates:
logger.debug(f"Removing {sheriff} from sheriff pool because they sheriffed on {w}")
sheriff_candidates.remove(sheriff)
# pick a leader
leader = random.choice(leader_candidates)
logger.debug(f"Picked {leader} as leader")
# remove leader from pool
sheriff_candidates.remove(leader)
logger.debug(f"Removed {leader} from sheriff pool because they have been picked as the leader")
# pick sheriffs from pool
sheriffs = []
for _ in range(2):
geos = {s.geo for s in [leader] + sheriffs}
if len(geos) > 1:
# remove sheriffs outside of selected geos from pool
for sheriff in [c for c in sheriff_candidates if c.geo not in geos]:
logger.debug(f"Removing {sheriff} from pool as they are in {sheriff.geo} and leader/sheriffs are in {geos}")
sheriff_candidates.remove(sheriff)
if len(sheriff_candidates) > 0:
random.shuffle(sheriff_candidates)
sheriff = sheriff_candidates.pop()
sheriffs.append(sheriff)
logger.debug(f"Picked {sheriff} as sheriff")
return Rotation(leader, sheriffs)