Reformat to spaces + fix lehvenstein hopefully

This commit is contained in:
Nicba1010
2018-02-05 02:19:41 +01:00
parent 1f139efd41
commit a41c6c92b7
8 changed files with 334 additions and 332 deletions

View File

@@ -10,83 +10,83 @@ base_url = "https://rpcs3.net/compatibility"
newline_separator = "<newline>"
return_codes = {
0: {
"display_results": True,
"override_all": False,
"display_footer": True,
"info": "Results successfully retrieved."
},
1: {
"display_results": False,
"override_all": False,
"display_footer": True,
"info": "No results."
},
2: {
"display_results": True,
"override_all": False,
"display_footer": True,
"info": "No match was found, displaying closest results."
},
-1: {
"display_results": False,
"override_all": True,
"display_footer": False,
"info": "{requestor}: Internal error occurred, please contact Ani and Nicba1010"
},
-2: {
"display_results": False,
"override_all": True,
"display_footer": False,
"info": "{requestor}: API is under maintenance, please try again later."
},
-3: {
"display_results": False,
"override_all": False,
"display_footer": False,
"info": "Illegal characters found, please try again with a different search term."
}
0: {
"display_results": True,
"override_all": False,
"display_footer": True,
"info": "Results successfully retrieved."
},
1: {
"display_results": False,
"override_all": False,
"display_footer": True,
"info": "No results."
},
2: {
"display_results": True,
"override_all": False,
"display_footer": True,
"info": "No match was found, displaying results for: ***{lehvenstein}***."
},
-1: {
"display_results": False,
"override_all": True,
"display_footer": False,
"info": "{requestor}: Internal error occurred, please contact Ani and Nicba1010"
},
-2: {
"display_results": False,
"override_all": True,
"display_footer": False,
"info": "{requestor}: API is under maintenance, please try again later."
},
-3: {
"display_results": False,
"override_all": False,
"display_footer": False,
"info": "Illegal characters found, please try again with a different search term."
}
}
default_amount = 1
request_result_amount = {
1: 15,
2: 25,
3: 50,
4: 100
1: 15,
2: 25,
3: 50,
4: 100
}
directions = {
"a": ("a", "asc", "ascending"),
"d": ("d", "desc", "descending")
"a": ("a", "asc", "ascending"),
"d": ("d", "desc", "descending")
}
regions = {
"j": ("j", "jap", "japan", "JPN"),
"u": ("u", "us", "america", "USA"),
"e": ("e", "eu", "europe", "EU"),
"a": ("a", "asia", "ch", "china", "CHN"),
"k": ("k", "kor", "korea", "KOR"),
"h": ("h", "hk", "hong", "kong", "hongkong", "HK")
"j": ("j", "jap", "japan", "JPN"),
"u": ("u", "us", "america", "USA"),
"e": ("e", "eu", "europe", "EU"),
"a": ("a", "asia", "ch", "china", "CHN"),
"k": ("k", "kor", "korea", "KOR"),
"h": ("h", "hk", "hong", "kong", "hongkong", "HK")
}
statuses = {
"all": 0,
"playable": 1,
"ingame": 2,
"intro": 3,
"loadable": 4,
"nothing": 5
"all": 0,
"playable": 1,
"ingame": 2,
"intro": 3,
"loadable": 4,
"nothing": 5
}
sort_types = {
"id": 1,
"title": 2,
"status": 3,
"date": 4
"id": 1,
"title": 2,
"status": 3,
"date": 4
}
release_types = {
"b": ("b", "d", "disc", "bluray", "Blu-Ray"),
"n": ("n", "p", "psn", "PSN")
"b": ("b", "d", "disc", "bluray", "Blu-Ray"),
"n": ("n", "p", "psn", "PSN")
}

View File

@@ -13,188 +13,188 @@ from api.response import ApiResponse
class ApiRequest(object):
"""
API Request builder object
"""
"""
API Request builder object
"""
def __init__(self, requestor=None) -> None:
self.requestor = requestor
self.custom_header = None
self.time_start = None
self.search = None
self.status = None
self.start = None
self.sort = None
self.date = None
self.release_type = None
self.region = None
self.amount = api.default_amount
self.amount_wanted = api.request_result_amount[api.default_amount]
def __init__(self, requestor=None) -> None:
self.requestor = requestor
self.custom_header = None
self.time_start = None
self.search = None
self.status = None
self.start = None
self.sort = None
self.date = None
self.release_type = None
self.region = None
self.amount = api.default_amount
self.amount_wanted = api.request_result_amount[api.default_amount]
def set_search(self, search: str) -> 'ApiRequest':
"""
Adds the search string to the query.
:param search: string to search for
:return: ApiRequest object
"""
self.search = search
return self
def set_search(self, search: str) -> 'ApiRequest':
"""
Adds the search string to the query.
:param search: string to search for
:return: ApiRequest object
"""
self.search = search
return self
def set_custom_header(self, custom_header) -> 'ApiRequest':
"""
Sets a custom header.
:param custom_header: custom hedaer
:return: ApiRequest object
"""
self.custom_header = custom_header
def set_custom_header(self, custom_header) -> 'ApiRequest':
"""
Sets a custom header.
:param custom_header: custom hedaer
:return: ApiRequest object
"""
self.custom_header = custom_header
def set_status(self, status: int) -> 'ApiRequest':
"""
Adds status filter to the query.
:param status: status to filter by, see ApiConfig.statuses
:return: ApiRequest object
"""
try:
self.status = api.statuses[status]
except KeyError:
self.status = None
def set_status(self, status: int) -> 'ApiRequest':
"""
Adds status filter to the query.
:param status: status to filter by, see ApiConfig.statuses
:return: ApiRequest object
"""
try:
self.status = api.statuses[status]
except KeyError:
self.status = None
return self
return self
def set_startswith(self, start: str) -> 'ApiRequest':
"""
Adds starting character filter to the query.
:param start: character to filter by
:return: ApiRequest object
"""
if len(start) != 1:
if start in ("num", "09"):
self.start = "09"
elif start in ("sym", "#"):
self.start = "sym"
else:
self.start = start
def set_startswith(self, start: str) -> 'ApiRequest':
"""
Adds starting character filter to the query.
:param start: character to filter by
:return: ApiRequest object
"""
if len(start) != 1:
if start in ("num", "09"):
self.start = "09"
elif start in ("sym", "#"):
self.start = "sym"
else:
self.start = start
return self
return self
def set_sort(self, sort_type, direction) -> 'ApiRequest':
"""
Adds sorting request to query.
:param sort_type: element to sort by, see ApiConfig.sort_types
:param direction: sorting direction, see ApiConfig.directions
:return: ApiRequest object
"""
for k, v in api.directions.items():
if direction in v:
try:
self.sort = str(api.sort_types[sort_type]) + k
return self
except KeyError:
self.sort = None
return self
def set_sort(self, sort_type, direction) -> 'ApiRequest':
"""
Adds sorting request to query.
:param sort_type: element to sort by, see ApiConfig.sort_types
:param direction: sorting direction, see ApiConfig.directions
:return: ApiRequest object
"""
for k, v in api.directions.items():
if direction in v:
try:
self.sort = str(api.sort_types[sort_type]) + k
return self
except KeyError:
self.sort = None
return self
return self
return self
def set_date(self, date: str) -> 'ApiRequest':
"""
Adds date filter to query.
:param date: date to filter by
:return: ApiRequest object
"""
try:
date = datetime.strptime(date, datetime_input_format)
self.date = datetime.strftime(date, datetime_compatlist_query_format)
except ValueError:
self.date = None
def set_date(self, date: str) -> 'ApiRequest':
"""
Adds date filter to query.
:param date: date to filter by
:return: ApiRequest object
"""
try:
date = datetime.strptime(date, datetime_input_format)
self.date = datetime.strftime(date, datetime_compatlist_query_format)
except ValueError:
self.date = None
return self
return self
def set_release_type(self, release_type: str) -> 'ApiRequest':
"""
Adds release type filter to query.
:param release_type: release type to filter by, see ApiConfig.release_type
:return: ApiRequest object
"""
for k, v in api.release_types.items():
if release_type in v:
self.release_type = k
return self
def set_release_type(self, release_type: str) -> 'ApiRequest':
"""
Adds release type filter to query.
:param release_type: release type to filter by, see ApiConfig.release_type
:return: ApiRequest object
"""
for k, v in api.release_types.items():
if release_type in v:
self.release_type = k
return self
self.release_type = None
return self
self.release_type = None
return self
def set_region(self, region: str) -> 'ApiRequest':
"""
Adds region filter to query.
:param region: region to filter by, see ApiConfig.regions
:return: ApiRequest object
"""
for k, v in api.regions.items():
if region in v:
self.region = k
return self
def set_region(self, region: str) -> 'ApiRequest':
"""
Adds region filter to query.
:param region: region to filter by, see ApiConfig.regions
:return: ApiRequest object
"""
for k, v in api.regions.items():
if region in v:
self.region = k
return self
self.region = None
return self
self.region = None
return self
def set_amount(self, amount: int) -> 'ApiRequest':
"""
Sets the desired result count and gets the closest available.
:param amount: desired result count, chooses closest available option, see ApiConfig.request_result_amount
:return: ApiRequest object
"""
if max(api.request_result_amount.values()) >= amount >= 1:
current_diff = -1
def set_amount(self, amount: int) -> 'ApiRequest':
"""
Sets the desired result count and gets the closest available.
:param amount: desired result count, chooses closest available option, see ApiConfig.request_result_amount
:return: ApiRequest object
"""
if max(api.request_result_amount.values()) >= amount >= 1:
current_diff = -1
for k, v in api.request_result_amount.items():
if v >= amount:
diff = v - amount
if diff < current_diff or current_diff == -1:
self.amount = k
current_diff = diff
for k, v in api.request_result_amount.items():
if v >= amount:
diff = v - amount
if diff < current_diff or current_diff == -1:
self.amount = k
current_diff = diff
if current_diff != -1:
self.amount_wanted = amount
else:
self.amount_wanted = None
self.amount = api.default_amount
if current_diff != -1:
self.amount_wanted = amount
else:
self.amount_wanted = None
self.amount = api.default_amount
return self
return self
def build_query(self) -> str:
"""
Builds the search query.
:return: the search query
"""
url = base_url + "?"
def build_query(self) -> str:
"""
Builds the search query.
:return: the search query
"""
url = base_url + "?"
if self.search is not None:
url += "g={}&".format(html.escape(self.search).replace(" ", "%20"))
if self.status is not None:
url += "s={}&".format(self.status)
if self.start is not None:
url += "c={}&".format(self.start)
if self.sort is not None:
url += "o={}&".format(self.sort)
if self.date is not None:
url += "d={}&".format(self.date)
if self.release_type is not None:
url += "t={}&".format(self.release_type)
if self.region is not None:
url += "f={}&".format(self.region)
if self.search is not None:
url += "g={}&".format(html.escape(self.search).replace(" ", "%20"))
if self.status is not None:
url += "s={}&".format(self.status)
if self.start is not None:
url += "c={}&".format(self.start)
if self.sort is not None:
url += "o={}&".format(self.sort)
if self.date is not None:
url += "d={}&".format(self.date)
if self.release_type is not None:
url += "t={}&".format(self.release_type)
if self.region is not None:
url += "f={}&".format(self.region)
return url + "api=v{}".format(version)
return url + "api=v{}".format(version)
def request(self) -> ApiResponse:
"""
Makes an API request to the API with the current request configuration.
:return: the API response
"""
print(self.build_query())
self.time_start = api.system_time_millis()
return ApiResponse(
request=self,
data=requests.get(self.build_query()).content,
amount_wanted=self.amount_wanted,
custom_header=self.custom_header
)
def request(self) -> ApiResponse:
"""
Makes an API request to the API with the current request configuration.
:return: the API response
"""
print(self.build_query())
self.time_start = api.system_time_millis()
return ApiResponse(
request=self,
data=requests.get(self.build_query()).content,
amount_wanted=self.amount_wanted,
custom_header=self.custom_header
)

View File

@@ -10,86 +10,88 @@ from .result import ApiResult
class ApiResponse(object):
"""
API Response object
"""
"""
API Response object
"""
# noinspection PyUnresolvedReferences
def __init__(self, request: 'ApiRequest', data: Dict, amount_wanted: int = None, custom_header: str = None) -> None:
self.request = request
self.results: List[ApiResult] = []
# noinspection PyUnresolvedReferences
def __init__(self, request: 'ApiRequest', data: Dict, amount_wanted: int = None, custom_header: str = None) -> None:
self.request = request
self.results: List[ApiResult] = []
parsed_data = json.loads(data)
self.code = parsed_data["return_code"]
if return_codes[self.code]["display_results"]:
self.load_results(parsed_data["results"], amount=amount_wanted)
parsed_data = json.loads(data)
self.code = parsed_data["return_code"]
self.lehvenstein = parsed_data["search_term"] if self.code is 2 else ''
if return_codes[self.code]["display_results"]:
self.load_results(parsed_data["results"], amount=amount_wanted)
self.time_end = system_time_millis()
self.custom_header = custom_header
self.time_end = system_time_millis()
self.custom_header = custom_header
def load_results(self, data: Dict, amount: int = None) -> None:
"""
Loads the result object from JSON
:param data: data for the result objects
:param amount: desired amount to load
"""
for game_id, result_data in data.items():
if amount is None or len(self.results) < amount:
self.results.append(ApiResult(game_id, result_data))
else:
break
def load_results(self, data: Dict, amount: int = None) -> None:
"""
Loads the result object from JSON
:param data: data for the result objects
:param amount: desired amount to load
"""
for game_id, result_data in data.items():
if amount is None or len(self.results) < amount:
self.results.append(ApiResult(game_id, result_data))
else:
break
def to_string(self) -> str:
"""
Makes a string representation of the object.
:return: string representation of the object
"""
return self.build_string().format(
requestor=self.request.requestor.mention,
search_string=self.request.search,
request_url=self.request.build_query().replace("&api=v1", ""),
milliseconds=self.time_end - self.request.time_start,
amount=self.request.amount_wanted,
region="" if self.request.region is None else regions[self.request.region][-1],
media="" if self.request.release_type is None else release_types[self.request.release_type][-1]
)
def to_string(self) -> str:
"""
Makes a string representation of the object.
:return: string representation of the object
"""
return self.build_string().format(
requestor=self.request.requestor.mention,
search_string=self.request.search,
request_url=self.request.build_query().replace("&api=v1", ""),
milliseconds=self.time_end - self.request.time_start,
amount=self.request.amount_wanted,
region="" if self.request.region is None else regions[self.request.region][-1],
media="" if self.request.release_type is None else release_types[self.request.release_type][-1],
lehvenstein=self.lehvenstein
)
def build_string(self) -> str:
"""
Builds a string representation of the object with placeholder.
:return: string representation of the object with placeholder
"""
header_string = search_header if self.custom_header is None else self.custom_header
results_string = ""
def build_string(self) -> str:
"""
Builds a string representation of the object with placeholder.
:return: string representation of the object with placeholder
"""
header_string = search_header if self.custom_header is None else self.custom_header
results_string = ""
results_string_part = "```\n"
for result in self.results:
result_string = result.to_string()
results_string_part = "```\n"
for result in self.results:
result_string = result.to_string()
if len(results_string_part) + len(result_string) + 4 > 2000:
results_string_part += "```"
results_string += results_string_part + newline_separator
results_string_part = "```\n"
if len(results_string_part) + len(result_string) + 4 > 2000:
results_string_part += "```"
results_string += results_string_part + newline_separator
results_string_part = "```\n"
results_string_part += result_string + '\n'
results_string_part += result_string + '\n'
if results_string_part != "```\n":
results_string_part += "```"
results_string += results_string_part
if results_string_part != "```\n":
results_string_part += "```"
results_string += results_string_part
footer_string = "Retrieved from: *{request_url}* in {milliseconds} milliseconds!"
if return_codes[self.code]["display_results"]:
return "{}{}{}{}{}".format(
header_string + '\n' + return_codes[self.code]["info"],
newline_separator,
results_string,
newline_separator,
footer_string
)
elif return_codes[self.code]["override_all"]:
return return_codes[self.code]["info"]
else:
return "{}{}".format(
header_string + '\n' + return_codes[self.code]["info"],
(newline_separator + footer_string) if return_codes[self.code]["display_footer"] else ""
)
footer_string = "Retrieved from: *{request_url}* in {milliseconds} milliseconds!"
if return_codes[self.code]["display_results"]:
return "{}{}{}{}{}".format(
header_string + '\n' + return_codes[self.code]["info"],
newline_separator,
results_string,
newline_separator,
footer_string
)
elif return_codes[self.code]["override_all"]:
return return_codes[self.code]["info"]
else:
return "{}{}".format(
header_string + '\n' + return_codes[self.code]["info"],
(newline_separator + footer_string) if return_codes[self.code]["display_footer"] else ""
)

View File

@@ -9,28 +9,28 @@ from api import datetime_input_format, datetime_output_format, trim_string
class ApiResult(object):
"""
API Result object
"""
"""
API Result object
"""
def __init__(self, game_id: str, data: Dict) -> None:
self.game_id = game_id
self.title = data["title"]
self.status = data["status"]
self.date = datetime.strptime(data["date"], datetime_input_format)
self.thread = data["thread"]
self.commit = data["commit"]
self.pr = data["pr"]
def __init__(self, game_id: str, data: Dict) -> None:
self.game_id = game_id
self.title = data["title"]
self.status = data["status"]
self.date = datetime.strptime(data["date"], datetime_input_format)
self.thread = data["thread"]
self.commit = data["commit"]
self.pr = data["pr"]
def to_string(self) -> str:
"""
Makes a string representation of the object.
:return: string representation of the object
"""
return ("ID:{:9s} Title:{:40s} PR:{:4s} Status:{:8s} Updated:{:10s}".format(
self.game_id,
trim_string(self.title, 40),
self.pr if self.pr is not 0 else "????",
self.status,
datetime.strftime(self.date, datetime_output_format)
))
def to_string(self) -> str:
"""
Makes a string representation of the object.
:return: string representation of the object
"""
return ("ID:{:9s} Title:{:40s} PR:{:4s} Status:{:8s} Updated:{:10s}".format(
self.game_id,
trim_string(self.title, 40),
self.pr if self.pr is not 0 else "????",
self.status,
datetime.strftime(self.date, datetime_output_format)
))

View File

@@ -2,11 +2,11 @@ import time
def trim_string(string: str, length: int) -> str:
if len(string) > length:
return string[:length - 3] + "..."
else:
return string
if len(string) > length:
return string[:length - 3] + "..."
else:
return string
def system_time_millis() -> int:
return int(round(time.time() * 1000))
return int(round(time.time() * 1000))

2
bot.py
View File

@@ -196,7 +196,7 @@ async def greet():
Greets on boot!
"""
await rpcs3Bot.wait_until_ready()
await rpcs3Bot.send_message(discord.Object(id=bot_spam_id), boot_up_message)
return await rpcs3Bot.send_message(discord.Object(id=bot_spam_id), boot_up_message)
# User requests

View File

@@ -6,7 +6,7 @@ Variables:
{region} = Region
{media} = Blu-Ray/PSN
"""
search_header = "{requestor} searched for: ***{search_string}***"
search_header = "{requestor} searched for: ***{search_string}***"
newest_header = "{requestor} requested top {amount} newest {region} {media} updated games"
oldest_header = "{requestor} requested top {amount} oldest {region} {media} updated games"

View File

@@ -1,9 +1,9 @@
def limit_int(amount: int, high: int, low: int = 0) -> int:
"""
Limits an integer.
:param amount: amount
:param high: high limit
:param low: low limit
:return: limited integer
"""
return low if amount < low else (high if amount > high else amount)
"""
Limits an integer.
:param amount: amount
:param high: high limit
:param low: low limit
:return: limited integer
"""
return low if amount < low else (high if amount > high else amount)