Пример #1
0
 def run(event, user_id, valid_data):
     list_id = valid_data[UserAttr.LIST_ID]
     if not MatchHelper.delete(list_id):
         end("Unable to delete match listing.")
     if not UserUtils.update(user_id, UserAttr.LIST_ID, ""):
         end("Unable to clear user listing id.")
     return True
Пример #2
0
 def run(event, user_id, valid_data) -> bool:
     home_id = valid_data[UserAttr.CURRENT_HOME]
     grid_slot = event[RequestField.Home.GRID]
     item_meta = event[RequestField.Item.META]
     if not HomeHelper.update(home_id, grid_slot, item_meta):
         end("Unable to update meta for grid slot.")
     return True
Пример #3
0
 def validate(event, user_id) -> Dict[str, str]:
     HomeHelper.validate_grid_request(event, "Item Clear API (GRID SLOT)")
     if event[RequestField.Home.GRID] == Constants.Home.MATCH_GRID_SLOT:
         end("Cannot clear reserved home grid slot.")
     user_data = UserUtils.get(user_id, UserAttr.CURRENT_HOME)
     if not user_data:
         end("Unable to retrieve current home for user.")
     return user_data
Пример #4
0
    def run(event, user_id, valid_data) -> bool:
        if not HomeHelper.set_slot(
                home_id=valid_data[UserAttr.CURRENT_HOME],
                grid_slot=str(event[RequestField.Home.GRID]),
                item=event[RequestField.User.ITEM],
                meta=event[RequestField.Item.META],
        ):
            end("Unable to update selected grid slot.")

        return True
Пример #5
0
 def run(event, user_id, valid_data) -> bool:
     home_index = event[RequestField.User.HOME] - 1
     home_id = valid_data[UserAttr.HOMES][home_index]
     if not HomeHelper.delete(home_id):
         end("Unable to delete requested home.")
     # todo: do we need an extra if :value in #name condition here to catch misuse?
     if not UserUtils.update(user_id, UserAttr.HOMES, home_index,
                             "REMOVE #name :value"):
         end("Unable to remove deleted home from user.")
     return True
Пример #6
0
 def validate(event, user_id) -> Dict[str, str]:
     user_data = UserUtils.get(user_id, UserAttr.CURRENT_HOME)
     if not user_data:
         end("Unable to retrieve current home for user.")
     validate_meta(
         target=event,
         field=RequestField.Home.META,
         max_size=Config.HOME_META_LIMIT,
         message="Home Save API (META)",
     )
     return user_data
Пример #7
0
    def validate(event, user_id):
        user_data = UserUtils.get(user_id,
                                  f"{UserAttr.LIST_ID}, {UserAttr.MATCH_ID}")
        if not user_data:
            end("Unable to retrieve match and listing for user.")
        if user_data[UserAttr.LIST_ID]:
            seconds_old = MatchHelper.get_age(user_data[UserAttr.LIST_ID])
            if seconds_old < 2.5:  # todo: Config.ENLIST_DELAY
                end("Attempting to refresh listing too early.")

        return user_data
Пример #8
0
 def validate(event, user_id) -> Dict[str, Any]:
     user_data = UserUtils.get(user_id, UserAttr.HOMES)
     if not user_data:
         end("Unable to retrieve homes list for user.")
     validate_choice(
         target=event,
         field=RequestField.User.HOME,
         max=len(user_data[UserAttr.HOMES]),
         message="Home Delete API (CHOICE).",
     )
     return user_data
Пример #9
0
    def validate(event, user_id) -> Dict[str, Union[List[str], int]]:
        user_data = UserUtils.get(
            user_id=user_id,
            attributes=f"{UserAttr.KEY_COUNT}, {UserAttr.KEY_USED_COUNT}",
        )
        if not user_data:
            end("Unable to retrieve key and used key count for user.")
        if user_data[UserAttr.KEY_COUNT] <= 0:
            end(f"Insufficient keys: {user_data[UserAttr.KEY_COUNT]}")

        return user_data
Пример #10
0
 def run(event, user_id, valid_data) -> bool:
     request = SaveRequest(event[RequestField.User.SAVE])
     attribute, value = None, None
     if request == SaveRequest.NAME:
         attribute, value = UserAttr.NAME, RequestField.User.NAME
     elif request == SaveRequest.FLAG:
         attribute, value = UserAttr.FLAG, RequestField.User.FLAG
     elif request == SaveRequest.META:
         attribute, value = UserAttr.META, RequestField.User.META
     if not UserUtils.update(user_id, attribute, value):
         end("Unable to save user data.")
     return True
Пример #11
0
 def run(event, user_id, valid_data) -> bool:
     home_id = valid_data[UserAttr.CURRENT_HOME]
     meta_data = event[RequestField.Home.META]
     if not db_update(
         Key={TableKey.PARTITION: TablePartition.HOME, TableKey.SORT: home_id},
         UpdateExpression=f"SET #meta = :home_meta",
         ConditionExpression=f"attribute_exists(#id)",
         ExpressionAttributeNames={"#id": TableKey.SORT, "#meta": HomeAttr.META,},
         ExpressionAttributeValues={":home_meta": meta_data},
     ):
         end("Unable to save home meta.")
     return True
Пример #12
0
 def connect(self, readonly: bool = True) -> None:
     if not self.conn:
         try:
             self.conn = sqlite3.connect(
                 f"file:{ITEM_DB_PATH}?{'mode=ro' if readonly else 'mode=rw'}",
                 uri=True,
             )
         except sqlite3.Error as e:
             end(f"Item DB API (CONNECT): {e}")
         else:
             self.conn.create_collation("seeded_random", self.seeded_random)
             self.conn.row_factory = self.dict_factory
             self.cur = self.conn.cursor()
Пример #13
0
 def validate(event, user_id) -> Dict[str, str]:
     HomeHelper.validate_grid_request(
         target=event, message="Item Update API (GRID SLOT)"
     )
     validate_meta(
         target=event,
         field=RequestField.Item.META,
         max_size=Config.GRID_META_LIMIT,
         message="Item Update API (META)",
     )
     user_data = UserUtils.get(user_id, UserAttr.CURRENT_HOME)
     if not user_data:
         end("Unable to retrieve current home for user.")
     return user_data
Пример #14
0
def _db_try(table_function, *args,
            **kwargs) -> Optional[Dict[str, Any]]:  # noqa
    try:
        response = table_function(*args, **kwargs)
    except ClientError as e:
        error = e.response["Error"]["Code"]
        if error in (
                AWSError.RATE_LIMIT,
                AWSError.REQ_LIMIT,
                AWSError.WCU_LIMIT,
        ):
            raise RateException(View.error(error, RateException.__name__))
        return None
    except Exception as e:
        end(f"Unknown error ({type(e).__name__})."
            )  # todo: think about this one
    return response  # noqa
Пример #15
0
 def run(event, user_id, valid_data) -> Dict[str, Any]:
     home_index = event[RequestField.User.HOME] - 1
     home_id = valid_data[UserAttr.HOMES][home_index]
     response = table.get_item(
         Key={TableKey.PARTITION: TablePartition.HOME, TableKey.SORT: home_id},
         ProjectionExpression="#grid, #meta",
         ExpressionAttributeNames={
             "#id": TableKey.SORT,
             "#grid": HomeAttr.GRID,
             "#meta": HomeAttr.META,
         },
     )
     if not (response and "Item" in response and response["Item"]):
         end("Unable to get home data for requested home.")
     if not UserUtils.update(user_id, UserAttr.CURRENT_HOME, home_id):
         end("Unable to set user current home to requested home.")
     return response["Item"]
Пример #16
0
 def validate(event, user_id) -> Dict[str, int]:
     user_data = UserUtils.get(user_id, UserAttr.HOME_COUNT)
     if not user_data:
         end("Unable to retrieve home count for user.")
     if user_data[UserAttr.HOME_COUNT] >= Config.HOME_COUNT_MAX:
         end("Maximum homes reached.")
     validate_name(
         target=event,
         field=RequestField.Home.NAME,
         max_length=Constants.Home.NAME_MAX_LENGTH,
         message="Home Create API (NAME)",
     )
     validate_choice(
         target=event,
         field=RequestField.Home.BIODOME,
         max=Config.BIODOME_COUNT,
         message="Home Create API (BIODOME)",
     )
     return user_data
Пример #17
0
 def validate(event, user_id) -> Dict[str, Union[int, str]]:
     HomeHelper.validate_grid_request(event, "Item Place API (GRID SLOT)")
     if event[RequestField.Home.GRID] == Constants.Home.MATCH_GRID_SLOT:
         end("Cannot place reserved home grid slot.")
     validate_meta(
         target=event,
         field=RequestField.Item.META,
         max_size=Config.GRID_META_LIMIT,
         message="Item Place API (META)",
     )
     user_data = UserUtils.get(
         user_id,
         f"{UserAttr.INVENTORY_COUNT}, {UserAttr.CURRENT_HOME}",
     )
     if not user_data:
         end("Unable to retrieve inventory and current home for user.")
     validate_choice(
         target=event,
         field=RequestField.User.ITEM,
         max=user_data[UserAttr.INVENTORY_COUNT],
         message="Item Place API (ITEM CHOICE)",
     )
     return user_data
Пример #18
0
    def run(event, user_id, valid_data: Dict[str, str]) -> Union[str, bool]:
        match_id = valid_data[UserAttr.MATCH_ID]
        # todo: Config.MATCH_COOLDOWN
        if match_id and MatchHelper.get_age(match_id) < 10:
            return web_socket_endpoint()["address"]
        scan_items = MatchHelper.find_available(user_id)
        if not scan_items:
            return False
        scan_match_id = scan_items[0]["id"]

        seconds_old = MatchHelper.get_age(scan_match_id)
        # todo: Config.MATCH_TIMEOUT
        if seconds_old > 15:
            MatchHelper.delete(scan_match_id)
            return False

        if not MatchHelper.claim(scan_match_id, user_id):
            return False

        if not UserUtils.update(user_id, UserAttr.MATCH_ID, scan_match_id):
            end("Unable to update user match id.")
        # todo: send match id to chat server to expect lister_id and finder_id
        return web_socket_endpoint()["address"]
Пример #19
0
 def run(event, user_id, valid_data) -> bool:
     new_id = HomeHelper.new()
     if not new_id:
         end("Unable to create new home.")
     # TODO: delete home if add_home fails
     if not UserHelper.add_home(
         user_id,
         new_id,
         event[RequestField.Home.NAME],
         event[RequestField.Home.BIODOME],
     ):
         if not HomeHelper.delete(new_id):
             end("Unable to add home to user, and failed clean-up.")
         end("Unable to add home to user.")
     return True
Пример #20
0
    def run(event, user_id, valid_data) -> Union[bool, str]:
        match_id = valid_data[UserAttr.MATCH_ID]
        if match_id and MatchHelper.get_age(
                match_id) < 10:  # todo: put in config
            return web_socket_endpoint()["address"]
        list_id = valid_data[UserAttr.LIST_ID]
        if not list_id:
            new_id = MatchHelper.generate_id(user_id)
            if not MatchHelper.new(new_id, user_id):
                end("Unable to create match listing.")
            if not UserUtils.update(user_id, UserAttr.LIST_ID, new_id):
                end("Unable to update user listing id.")
            return True

        new_id = MatchHelper.generate_id(user_id)
        results = MatchHelper.upsert_return(list_id, new_id)
        if not results:
            end("Unable to refresh listing.")
        if MatchAttr.FINDER_ID in results.get("Attributes", {}):
            return True
        if not UserUtils.update(user_id, UserAttr.MATCH_ID, new_id):
            end("Unable to update user with claimed match.")
        return web_socket_endpoint()["address"]
Пример #21
0
 def validate(event: Dict[str, Any], user_id: Optional[str]) -> Dict[str, Any]:
     user_data = UserUtils.get(user_id, UserHelper.data_attributes())
     if not user_data:
         end("Unable to get data attributes for user.")
     return user_data
Пример #22
0
 def validate(event, user_id):
     user_data = UserUtils.get(user_id, UserAttr.LIST_ID)
     if not (user_data and user_data[UserAttr.LIST_ID]):
         end("User not listed.")
     return user_data
Пример #23
0
 def run(event, user_id, valid_data) -> bool:
     home_id = valid_data[UserAttr.CURRENT_HOME]
     grid_slot = event[RequestField.Home.GRID]
     if not HomeHelper.clear_slot(home_id, grid_slot):
         end("Unable to clear grid slot.")
     return True
Пример #24
0
 def run(event, user_id, valid_data) -> bool:
     if not UserHelper.archive(user_id):
         end("Unable to delete user.")
     return True
Пример #25
0
 def run(event, user_id, valid_data) -> dict:
     new_id = UserHelper.new(event[RequestField.User.NAME],
                             event[RequestField.User.FLAG])
     if not new_id:
         end("Unable to create new user.")
     return {ResponseField.User.ID: new_id}