Loading cogdb/side.py +28 −23 Original line number Diff line number Diff line Loading @@ -969,32 +969,36 @@ def monitor_events(session, system_ids): Returns: A list of messages to send. """ current = sqla_orm.aliased(FactionState) pending = sqla_orm.aliased(FactionState) monitor_states = session.query(FactionState.id).\ filter(FactionState.text.in_(["Election", "War", "Civil War", "Expansion", "Retreat"])).\ subquery() c_state = session.query(PowerState.id).\ scalar_subquery() control_state_id = session.query(PowerState.id).\ filter(PowerState.text == "Control").\ subquery() scalar_subquery() control_system = sqla_orm.aliased(System) events = session.query(Influence.influence, System.name, Faction.name, Government.text, control_system.name, current.text, pending.text).\ current = sqla_orm.aliased(FactionState) pending = sqla_orm.aliased(FactionState) sys = sqla_orm.aliased(System) sys_control = sqla_orm.aliased(System) events = session.query(Influence.influence, sys.name, Faction.name, Government.text, current.text, pending.text, sqla.func.ifnull(sys_control.name, 'N/A').label('control')).\ filter(Influence.system_id.in_(system_ids), sqla.or_(Influence.state_id.in_(monitor_states), Influence.pending_state_id.in_(monitor_states))).\ filter(Influence.system_id == System.id, Influence.faction_id == Faction.id, Faction.government_id == Government.id, sqla.and_(control_system.power_state_id == c_state, control_system.dist_to(System) <= 15), current.id == Influence.state_id, pending.id == Influence.pending_state_id).\ order_by(control_system.name, System.name, current.text, pending.text).\ join(sys, Influence.system_id == sys.id).\ join(Faction, Influence.faction_id == Faction.id).\ join(Government, Faction.government_id == Government.id).\ join(current, Influence.state_id == current.id).\ join(pending, Influence.pending_state_id == pending.id).\ outerjoin(sys_control, sqla.and_( sys_control.power_state_id == control_state_id, sys_control.dist_to(sys) < 15) ).\ order_by('control', sys.name, current.text, pending.text).\ limit(1000).\ all() __import__('pprint').pprint(events) wars = [["Control", "System", "Faction", "Gov", "Inf", "Current", "Pending"]] expansions = wars[:] Loading @@ -1002,8 +1006,8 @@ def monitor_events(session, system_ids): elections = wars[:] for event in events: states = [event[-2], event[-1]] line = [[event[-3], event[1][:16], event[2][:16], event[3][:3], states = [event[-3], event[-2]] line = [[event[-1], event[1][:16], event[2][:16], event[3][:3], "{:5.2f}".format(round(event[0], 2)), event[-2], event[-1]]] if "Election" in states: Loading @@ -1018,7 +1022,7 @@ def monitor_events(session, system_ids): if "Retreat" in states: retreats += line header = "**__Events in Monitored Systems__**\nMonitoring: {}\n\n**Elections**\n".format(", ".join(WATCH_BUBBLES)) header = "**__Events in Monitored Systems__**\n\n**Elections**\n" msgs = cog.tbl.format_table(elections, header=True, prefix=header) msgs += cog.tbl.format_table(wars, header=True, prefix="\n\n**Wars**\n") msgs += cog.tbl.format_table(expansions, header=True, prefix="\n\n**Expansions**\n") Loading Loading @@ -1201,7 +1205,7 @@ def monitor_factions(session, faction_names=None): filter(edb.Faction.name.in_(faction_names)). all()] control_id = session.query(PowerState.id).\ control_state_id = session.query(PowerState.id).\ filter(PowerState.text == "Control").\ scalar_subquery() matches = session.query(Influence.influence, sys.name, Faction.name, Loading @@ -1212,11 +1216,12 @@ def monitor_factions(session, faction_names=None): join(Faction, Influence.faction_id == Faction.id).\ join(Government, Faction.government_id == Government.id).\ join(current, Influence.state_id == current.id).\ outerjoin(pending, Influence.pending_state_id == pending.id).\ join(pending, Influence.pending_state_id == pending.id).\ outerjoin(sys_control, sqla.and_( sys_control.power_state_id == control_id, sys_control.power_state_id == control_state_id, sys_control.dist_to(sys) < 15) ).\ limit(1000).\ all() lines = [["Control", "System", "Faction", "Gov", "Inf", Loading tests/cogdb/test_side.py +25 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ from sqlalchemy.sql import text as sql_text import cog.exc import cog.util import cogdb.side from cogdb.side import BGSTick, SystemAge, System, Faction from cogdb.side import BGSTick, SystemAge, System, Faction, Influence, FactionState def test_bgstick__repr__(side_session): Loading Loading @@ -186,6 +186,30 @@ def test_get_system_ages(side_session): assert age.control == 'Sol' def test_monitor_events(side_session): # system_names = ["Sol", "Rana", "Rhea"] monitor_states = side_session.query(FactionState.id).\ filter(FactionState.text.in_(["Election", "War", "Civil War", "Expansion", "Retreat"])).\ scalar_subquery() system_ids = side_session.query(System.id).\ join(Faction, System.controlling_faction_id == Faction.id).\ join(FactionState, Faction.state_id == FactionState.id).\ filter(FactionState.id.in_(monitor_states)).\ limit(10).\ all() system_ids = [x[0] for x in system_ids] __import__('pprint').pprint(system_ids) results = cogdb.side.monitor_events(side_session, system_ids) __import__('pprint').pprint(results) # with cogdb.session_scope(cogdb.EDDBSession) as eddb_session: # system_ids = eddb_session.query(cogdb.eddb.System.id).\ # filter(cogdb.eddb.System.name.in_(system_names)).\ # all() # results = cogdb.side.monitor_events(side_session, system_ids) def test_monitor_factions(side_session): faction_names = ["Sol Workers' Party", "Sol Nationalists"] results = cogdb.side.monitor_factions(side_session, faction_names) Loading Loading
cogdb/side.py +28 −23 Original line number Diff line number Diff line Loading @@ -969,32 +969,36 @@ def monitor_events(session, system_ids): Returns: A list of messages to send. """ current = sqla_orm.aliased(FactionState) pending = sqla_orm.aliased(FactionState) monitor_states = session.query(FactionState.id).\ filter(FactionState.text.in_(["Election", "War", "Civil War", "Expansion", "Retreat"])).\ subquery() c_state = session.query(PowerState.id).\ scalar_subquery() control_state_id = session.query(PowerState.id).\ filter(PowerState.text == "Control").\ subquery() scalar_subquery() control_system = sqla_orm.aliased(System) events = session.query(Influence.influence, System.name, Faction.name, Government.text, control_system.name, current.text, pending.text).\ current = sqla_orm.aliased(FactionState) pending = sqla_orm.aliased(FactionState) sys = sqla_orm.aliased(System) sys_control = sqla_orm.aliased(System) events = session.query(Influence.influence, sys.name, Faction.name, Government.text, current.text, pending.text, sqla.func.ifnull(sys_control.name, 'N/A').label('control')).\ filter(Influence.system_id.in_(system_ids), sqla.or_(Influence.state_id.in_(monitor_states), Influence.pending_state_id.in_(monitor_states))).\ filter(Influence.system_id == System.id, Influence.faction_id == Faction.id, Faction.government_id == Government.id, sqla.and_(control_system.power_state_id == c_state, control_system.dist_to(System) <= 15), current.id == Influence.state_id, pending.id == Influence.pending_state_id).\ order_by(control_system.name, System.name, current.text, pending.text).\ join(sys, Influence.system_id == sys.id).\ join(Faction, Influence.faction_id == Faction.id).\ join(Government, Faction.government_id == Government.id).\ join(current, Influence.state_id == current.id).\ join(pending, Influence.pending_state_id == pending.id).\ outerjoin(sys_control, sqla.and_( sys_control.power_state_id == control_state_id, sys_control.dist_to(sys) < 15) ).\ order_by('control', sys.name, current.text, pending.text).\ limit(1000).\ all() __import__('pprint').pprint(events) wars = [["Control", "System", "Faction", "Gov", "Inf", "Current", "Pending"]] expansions = wars[:] Loading @@ -1002,8 +1006,8 @@ def monitor_events(session, system_ids): elections = wars[:] for event in events: states = [event[-2], event[-1]] line = [[event[-3], event[1][:16], event[2][:16], event[3][:3], states = [event[-3], event[-2]] line = [[event[-1], event[1][:16], event[2][:16], event[3][:3], "{:5.2f}".format(round(event[0], 2)), event[-2], event[-1]]] if "Election" in states: Loading @@ -1018,7 +1022,7 @@ def monitor_events(session, system_ids): if "Retreat" in states: retreats += line header = "**__Events in Monitored Systems__**\nMonitoring: {}\n\n**Elections**\n".format(", ".join(WATCH_BUBBLES)) header = "**__Events in Monitored Systems__**\n\n**Elections**\n" msgs = cog.tbl.format_table(elections, header=True, prefix=header) msgs += cog.tbl.format_table(wars, header=True, prefix="\n\n**Wars**\n") msgs += cog.tbl.format_table(expansions, header=True, prefix="\n\n**Expansions**\n") Loading Loading @@ -1201,7 +1205,7 @@ def monitor_factions(session, faction_names=None): filter(edb.Faction.name.in_(faction_names)). all()] control_id = session.query(PowerState.id).\ control_state_id = session.query(PowerState.id).\ filter(PowerState.text == "Control").\ scalar_subquery() matches = session.query(Influence.influence, sys.name, Faction.name, Loading @@ -1212,11 +1216,12 @@ def monitor_factions(session, faction_names=None): join(Faction, Influence.faction_id == Faction.id).\ join(Government, Faction.government_id == Government.id).\ join(current, Influence.state_id == current.id).\ outerjoin(pending, Influence.pending_state_id == pending.id).\ join(pending, Influence.pending_state_id == pending.id).\ outerjoin(sys_control, sqla.and_( sys_control.power_state_id == control_id, sys_control.power_state_id == control_state_id, sys_control.dist_to(sys) < 15) ).\ limit(1000).\ all() lines = [["Control", "System", "Faction", "Gov", "Inf", Loading
tests/cogdb/test_side.py +25 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ from sqlalchemy.sql import text as sql_text import cog.exc import cog.util import cogdb.side from cogdb.side import BGSTick, SystemAge, System, Faction from cogdb.side import BGSTick, SystemAge, System, Faction, Influence, FactionState def test_bgstick__repr__(side_session): Loading Loading @@ -186,6 +186,30 @@ def test_get_system_ages(side_session): assert age.control == 'Sol' def test_monitor_events(side_session): # system_names = ["Sol", "Rana", "Rhea"] monitor_states = side_session.query(FactionState.id).\ filter(FactionState.text.in_(["Election", "War", "Civil War", "Expansion", "Retreat"])).\ scalar_subquery() system_ids = side_session.query(System.id).\ join(Faction, System.controlling_faction_id == Faction.id).\ join(FactionState, Faction.state_id == FactionState.id).\ filter(FactionState.id.in_(monitor_states)).\ limit(10).\ all() system_ids = [x[0] for x in system_ids] __import__('pprint').pprint(system_ids) results = cogdb.side.monitor_events(side_session, system_ids) __import__('pprint').pprint(results) # with cogdb.session_scope(cogdb.EDDBSession) as eddb_session: # system_ids = eddb_session.query(cogdb.eddb.System.id).\ # filter(cogdb.eddb.System.name.in_(system_names)).\ # all() # results = cogdb.side.monitor_events(side_session, system_ids) def test_monitor_factions(side_session): faction_names = ["Sol Workers' Party", "Sol Nationalists"] results = cogdb.side.monitor_factions(side_session, faction_names) Loading