Commit 6a63007d authored by Jeremy Pallats's avatar Jeremy Pallats 💬
Browse files

FIX: Users for snipe and um sheets checked separately.

- FIX: Tests for inara with emoji to fetch from config.
parent 38ea1183
Loading
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ async def check_mentions(coro, *args, **kwargs):
        await coro(*args, **kwargs)


def check_sheet(scanner_name, attr, user_cls):
def check_sheet(scanner_name, attr, user_cls, sheet_src=None):
    """ Check if user present in sheet. """
    @decorator.decorator
    async def inner(coro, *args, **kwargs):
@@ -84,8 +84,10 @@ def check_sheet(scanner_name, attr, user_cls):
                          self.duser.display_name, user_cls.__name__, self.duser.pref_name)
            sheet = cogdb.query.add_sheet_user(
                self.session, cls=user_cls, discord_user=self.duser,
                start_row=get_scanner(scanner_name).user_row
                start_row=get_scanner(scanner_name).user_row, sheet_src=sheet_src
            )
            if sheet_src:
                sheet.sheet_src = sheet_src

            self.payloads += get_scanner(scanner_name).__class__.update_sheet_user_dict(
                sheet.row, sheet.cry, sheet.name)
@@ -1058,8 +1060,14 @@ class Hold(Action):
        return ([hold], response)

    @check_mentions
    @check_sheet('hudson_undermine', 'um_user', UMUser)
    @check_sheet('hudson_undermine', 'um_user', UMUser, sheet_src=EUMSheet.main)
    async def before_execute(self):
        """
        Decorate this async func to avoid multiple decorators.
        """

    async def execute(self):
        await self.before_execute()
        self.log.info('HOLD %s - Matched self.duser with id %s and sheet name %s.',
                      self.duser.display_name, self.duser.id, self.undermine)

@@ -1110,7 +1118,12 @@ class SnipeHold(Hold):
    """
    SnipeHold, same as Hold but for snipe sheet.
    """
    pass
    @check_mentions
    @check_sheet('hudson_snipe', 'snipe_user', UMUser, sheet_src=EUMSheet.snipe)
    async def before_execute(self):
        """
        Decorate this async func to avoid multiple decorators.
        """


class KOS(Action):
+9 −4
Original line number Diff line number Diff line
@@ -167,12 +167,16 @@ def check_pref_name(session, new_name):
        pass


def next_sheet_row(session, *, cls, start_row):
def next_sheet_row(session, *, cls, start_row, sheet_src=None):
    """
    Find the next available row to add in the sheet based on entries.
    """
    next_row = start_row
    rows = [x[0] for x in session.query(cls.row).order_by(cls.row).all()]
    query = session.query(cls.row)
    if sheet_src:
        query = query.filter(cls.sheet_src == sheet_src)
    query = query.order_by(cls.row)
    rows = [x[0] for x in query.all()]
    if rows:
        complete_list = list(range(rows[0], rows[-1] + 2))
        next_row = sorted(list(set(complete_list) - set(rows)))[0]
@@ -180,7 +184,7 @@ def next_sheet_row(session, *, cls, start_row):
    return next_row


def add_sheet_user(session, *, cls, discord_user, start_row):
def add_sheet_user(session, *, cls, discord_user, start_row, sheet_src=None):
    """
    Add a fort sheet user to system based on a Member.

@@ -188,8 +192,9 @@ def add_sheet_user(session, *, cls, discord_user, start_row):
        cls: The class of the sheet user like FortUser.
        duser: The DiscordUser object of the requesting user.
        start_row: Starting row if none inserted.
        sheet_src: Optionally, the sheet_src to filter UMUsers against.
    """
    next_row = next_sheet_row(session, cls=cls, start_row=start_row)
    next_row = next_sheet_row(session, cls=cls, start_row=start_row, sheet_src=sheet_src)
    user = cls(name=discord_user.pref_name, cry=discord_user.pref_cry, row=next_row)
    session.add(user)
    session.commit()
+10 −2
Original line number Diff line number Diff line
@@ -67,11 +67,19 @@ class DiscordUser(Base):
    )
    um_user = sqla.orm.relationship(
        'UMUser', uselist=False, viewonly=True,
        primaryjoin='foreign(DiscordUser.pref_name) == UMUser.name'
        primaryjoin="and_(foreign(DiscordUser.pref_name) == UMUser.name, UMUser.sheet_src == 'main')"
    )
    um_merits = sqla_orm.relationship(
        'UMHold', lazy='select', uselist=True, viewonly=True,
        primaryjoin='and_(foreign(DiscordUser.pref_name) == remote(UMUser.name), foreign(UMUser.id) == UMHold.user_id)'
        primaryjoin="and_(foreign(DiscordUser.pref_name) == remote(UMUser.name), foreign(UMUser.id) == UMHold.user_id, UMUser.sheet_src == 'main')"
    )
    snipe_user = sqla.orm.relationship(
        'UMUser', uselist=False, viewonly=True,
        primaryjoin="and_(foreign(DiscordUser.pref_name) == UMUser.name, UMUser.sheet_src == 'snipe')"
    )
    snipe_merits = sqla_orm.relationship(
        'UMHold', lazy='select', uselist=True, viewonly=True,
        primaryjoin="and_(foreign(DiscordUser.pref_name) == remote(UMUser.name), foreign(UMUser.id) == UMHold.user_id, UMUser.sheet_src == 'snipe')"
    )

    def __repr__(self):
+3 −3
Original line number Diff line number Diff line
@@ -92,7 +92,7 @@ async def test_friendly_detector_already_in_kos(f_bot):
async def test_friendly_detector_canceled(f_bot):
    api = cog.inara.InaraApi()
    f_msg = fake_msg_gears('!whois Prozer')
    emoji_cancel = "\u274C"
    emoji_cancel = cog.util.CONF.emojis._no
    f_bot.wait_for.async_return_value = emoji_cancel, None
    cmdr = {"name": "Prozer", "allegiance": "Federation"}
    is_friendly_returned, squad_returned = await api.friendly_detector(cmdr, False, [], f_msg)
@@ -104,7 +104,7 @@ async def test_friendly_detector_canceled(f_bot):
async def test_friendly_detector_friendly_no_squad(f_bot):
    api = cog.inara.InaraApi()
    f_msg = fake_msg_gears('!whois Prozer')
    emoji_friendly = "\U0001F7E2"
    emoji_friendly = cog.util.CONF.emojis._friendly
    f_bot.wait_for.async_return_value = emoji_friendly, None
    cmdr = {"name": "Prozer", "allegiance": "Federation"}
    is_friendly_returned, squad_returned = await api.friendly_detector(cmdr, False, [], f_msg)
@@ -116,7 +116,7 @@ async def test_friendly_detector_friendly_no_squad(f_bot):
@pytest.mark.asyncio
async def test_friendly_detector_hostile_with_squad(f_bot):
    api = cog.inara.InaraApi()
    emoji_hostile = "\U0001F534"
    emoji_hostile = cog.util.CONF.emojis._hostile
    f_bot.wait_for.async_return_value = emoji_hostile, None
    f_msg = fake_msg_gears('!whois Akeno')
    cmdr = {"name": "Akeno", "allegiance": "Empire", "squad": "Test"}
+0 −16
Original line number Diff line number Diff line
@@ -14,12 +14,6 @@ dbs:
discord:
  dev: NotUsed

emojis:
  _no: "\u274C"
  _yes: "\u2705"
  _friendly: "\U0001F7E2"
  _hostile: "\U0001F534"

inara:
  proto_header:  # Test inara
    appName: CogBotTest
@@ -32,16 +26,6 @@ pastebin:
  user: {{starcraftman/cogbot/paste/user}}
  pass: {{starcraftman/cogbot/paste/pass}}

# Internal paths to important files. Relative project root, no need to edit.
paths:
  log_conf: data/log.yml
  service_json: data/service_sheets.json

# Used for the scheduler hook incoming from sheets, advanced topic. Ignore for now.
ports:
  sanic: 8000  # nginx passthru -> web.app (sanic server)
  zmq: 9000  # see web.app -> cog.schedule

# Don't touch these at all, they are used for unit testing. You should build test around existing.
scanners:
  hudson_cattle: