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
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
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
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
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
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
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
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
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
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
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
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()
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
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
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"]
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
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
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"]
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
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"]
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
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
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
def run(event, user_id, valid_data) -> bool: if not UserHelper.archive(user_id): end("Unable to delete user.") return True
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}