Update to stricter type checking, get rid of a bunch of unnecessary ignore statements.
This commit is contained in:
parent
5d365f3ee4
commit
2eb39f86cd
@ -2,7 +2,7 @@ import copy
|
|||||||
import json
|
import json
|
||||||
import traceback
|
import traceback
|
||||||
from typing import Any, Callable, Dict
|
from typing import Any, Callable, Dict
|
||||||
from flask import Flask, abort, request, Response # type: ignore
|
from flask import Flask, abort, request, Response
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
from bemani.api.exceptions import APIException
|
from bemani.api.exceptions import APIException
|
||||||
|
@ -26,7 +26,7 @@ class AESCipher:
|
|||||||
|
|
||||||
def encrypt(self, raw: str) -> str:
|
def encrypt(self, raw: str) -> str:
|
||||||
raw = self.__pad(raw)
|
raw = self.__pad(raw)
|
||||||
random = Random.new() # type: ignore
|
random = Random.new()
|
||||||
iv = random.read(AES.block_size)
|
iv = random.read(AES.block_size)
|
||||||
cipher = AES.new(self.__key, AES.MODE_CBC, iv)
|
cipher = AES.new(self.__key, AES.MODE_CBC, iv)
|
||||||
return base64.b64encode(iv + cipher.encrypt(raw.encode('utf-8')), altchars=b"._").decode('utf-8')
|
return base64.b64encode(iv + cipher.encrypt(raw.encode('utf-8')), altchars=b"._").decode('utf-8')
|
||||||
|
@ -33,7 +33,7 @@ class Time:
|
|||||||
now.year,
|
now.year,
|
||||||
now.month,
|
now.month,
|
||||||
now.day,
|
now.day,
|
||||||
tzinfo=tz.tzutc() # type: ignore
|
tzinfo=tz.tzutc()
|
||||||
)
|
)
|
||||||
end_of_day = beginning_of_day + datetime.timedelta(days=1)
|
end_of_day = beginning_of_day + datetime.timedelta(days=1)
|
||||||
return calendar.timegm(end_of_day.timetuple())
|
return calendar.timegm(end_of_day.timetuple())
|
||||||
@ -48,7 +48,7 @@ class Time:
|
|||||||
now.year,
|
now.year,
|
||||||
now.month,
|
now.month,
|
||||||
now.day,
|
now.day,
|
||||||
tzinfo=tz.tzutc() # type: ignore
|
tzinfo=tz.tzutc()
|
||||||
)
|
)
|
||||||
return calendar.timegm(beginning_of_day.timetuple())
|
return calendar.timegm(beginning_of_day.timetuple())
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ class Time:
|
|||||||
Returns the unix timestamp for the end of this week in UTC timezone.
|
Returns the unix timestamp for the end of this week in UTC timezone.
|
||||||
"""
|
"""
|
||||||
now = datetime.datetime.utcnow().date()
|
now = datetime.datetime.utcnow().date()
|
||||||
this_week = now - datetime.timedelta(days=now.timetuple().tm_wday) # type: ignore
|
this_week = now - datetime.timedelta(days=now.timetuple().tm_wday)
|
||||||
next_week = this_week + datetime.timedelta(days=7)
|
next_week = this_week + datetime.timedelta(days=7)
|
||||||
return calendar.timegm(next_week.timetuple())
|
return calendar.timegm(next_week.timetuple())
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ class Time:
|
|||||||
Returns the unix timestamp for the beginning of this week in UTC timezone.
|
Returns the unix timestamp for the beginning of this week in UTC timezone.
|
||||||
"""
|
"""
|
||||||
now = datetime.datetime.utcnow().date()
|
now = datetime.datetime.utcnow().date()
|
||||||
this_week = now - datetime.timedelta(days=now.timetuple().tm_wday) # type: ignore
|
this_week = now - datetime.timedelta(days=now.timetuple().tm_wday)
|
||||||
return calendar.timegm(this_week.timetuple())
|
return calendar.timegm(this_week.timetuple())
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -117,7 +117,7 @@ class Time:
|
|||||||
date = datetime.datetime.utcnow().date()
|
date = datetime.datetime.utcnow().date()
|
||||||
else:
|
else:
|
||||||
date = datetime.datetime.utcfromtimestamp(timestamp).date()
|
date = datetime.datetime.utcfromtimestamp(timestamp).date()
|
||||||
week = date - datetime.timedelta(days=date.timetuple().tm_wday) # type: ignore
|
week = date - datetime.timedelta(days=date.timetuple().tm_wday)
|
||||||
return (week - datetime.date(1970, 1, 1)).days
|
return (week - datetime.date(1970, 1, 1)).days
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -131,7 +131,7 @@ class Time:
|
|||||||
date = datetime.datetime.utcnow().date().timetuple()
|
date = datetime.datetime.utcnow().date().timetuple()
|
||||||
else:
|
else:
|
||||||
date = datetime.datetime.utcfromtimestamp(timestamp).date().timetuple()
|
date = datetime.datetime.utcfromtimestamp(timestamp).date().timetuple()
|
||||||
return [date.tm_year, date.tm_yday] # type: ignore
|
return [date.tm_year, date.tm_yday]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def days_into_week(timestamp: Optional[int]=None) -> int:
|
def days_into_week(timestamp: Optional[int]=None) -> int:
|
||||||
@ -144,7 +144,7 @@ class Time:
|
|||||||
date = datetime.datetime.utcnow().date().timetuple()
|
date = datetime.datetime.utcnow().date().timetuple()
|
||||||
else:
|
else:
|
||||||
date = datetime.datetime.utcfromtimestamp(timestamp).date().timetuple()
|
date = datetime.datetime.utcfromtimestamp(timestamp).date().timetuple()
|
||||||
return date.tm_wday # type: ignore
|
return date.tm_wday
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def timestamp_from_date(year: int, month: int=1, day: int=1) -> int:
|
def timestamp_from_date(year: int, month: int=1, day: int=1) -> int:
|
||||||
@ -164,7 +164,7 @@ class Time:
|
|||||||
year,
|
year,
|
||||||
month,
|
month,
|
||||||
day,
|
day,
|
||||||
tzinfo=tz.tzutc() # type: ignore
|
tzinfo=tz.tzutc()
|
||||||
)
|
)
|
||||||
return calendar.timegm(date.timetuple())
|
return calendar.timegm(date.timetuple())
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ from alembic.migration import MigrationContext # type: ignore
|
|||||||
from alembic.autogenerate import compare_metadata # type: ignore
|
from alembic.autogenerate import compare_metadata # type: ignore
|
||||||
from sqlalchemy import create_engine # type: ignore
|
from sqlalchemy import create_engine # type: ignore
|
||||||
from sqlalchemy.orm import scoped_session # type: ignore
|
from sqlalchemy.orm import scoped_session # type: ignore
|
||||||
from sqlalchemy.orm import sessionmaker # type: ignore
|
from sqlalchemy.orm import sessionmaker
|
||||||
from sqlalchemy.engine import Engine # type: ignore
|
from sqlalchemy.engine import Engine # type: ignore
|
||||||
from sqlalchemy.sql import text # type: ignore
|
from sqlalchemy.sql import text # type: ignore
|
||||||
from sqlalchemy.exc import ProgrammingError # type: ignore
|
from sqlalchemy.exc import ProgrammingError # type: ignore
|
||||||
@ -125,7 +125,7 @@ class Data:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_engine(cls, config: Dict[str, Any]) -> Engine:
|
def create_engine(cls, config: Dict[str, Any]) -> Engine:
|
||||||
return create_engine( # type: ignore
|
return create_engine(
|
||||||
Data.sqlalchemy_url(config),
|
Data.sqlalchemy_url(config),
|
||||||
pool_recycle=3600,
|
pool_recycle=3600,
|
||||||
)
|
)
|
||||||
@ -161,7 +161,7 @@ class Data:
|
|||||||
# Cowardly refused to do anything, we should be using the upgrade path instead.
|
# Cowardly refused to do anything, we should be using the upgrade path instead.
|
||||||
raise DBCreateException('Tables already created, use upgrade to upgrade schema!')
|
raise DBCreateException('Tables already created, use upgrade to upgrade schema!')
|
||||||
|
|
||||||
metadata.create_all( # type: ignore
|
metadata.create_all(
|
||||||
self.__config['database']['engine'].connect(),
|
self.__config['database']['engine'].connect(),
|
||||||
checkfirst=True,
|
checkfirst=True,
|
||||||
)
|
)
|
||||||
|
@ -12,7 +12,7 @@ from bemani.data.types import Client, Server
|
|||||||
Table for storing registered clients to a data exchange API, as added
|
Table for storing registered clients to a data exchange API, as added
|
||||||
by an admin.
|
by an admin.
|
||||||
"""
|
"""
|
||||||
client = Table( # type: ignore
|
client = Table(
|
||||||
'client',
|
'client',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -26,7 +26,7 @@ client = Table( # type: ignore
|
|||||||
Table for storing remote servers to a data exchange API, as added
|
Table for storing remote servers to a data exchange API, as added
|
||||||
by an admin.
|
by an admin.
|
||||||
"""
|
"""
|
||||||
server = Table( # type: ignore
|
server = Table(
|
||||||
'server',
|
'server',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
|
@ -10,13 +10,13 @@ from sqlalchemy.sql import text # type: ignore
|
|||||||
from sqlalchemy.types import String, Integer # type: ignore
|
from sqlalchemy.types import String, Integer # type: ignore
|
||||||
from sqlalchemy import Table, Column, MetaData # type: ignore
|
from sqlalchemy import Table, Column, MetaData # type: ignore
|
||||||
|
|
||||||
metadata = MetaData() # type: ignore
|
metadata = MetaData()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Table for storing session IDs, so a session ID can be used to look up an arbitrary ID.
|
Table for storing session IDs, so a session ID can be used to look up an arbitrary ID.
|
||||||
This is currently used for user logins, user and arcade PASELI sessions.
|
This is currently used for user logins, user and arcade PASELI sessions.
|
||||||
"""
|
"""
|
||||||
session = Table( # type: ignore
|
session = Table(
|
||||||
'session',
|
'session',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False),
|
Column('id', Integer, nullable=False),
|
||||||
@ -74,7 +74,7 @@ class BaseData:
|
|||||||
]:
|
]:
|
||||||
if write_statement in sql.lower() and not safe_write_operation:
|
if write_statement in sql.lower() and not safe_write_operation:
|
||||||
raise Exception('Read-only mode is active!')
|
raise Exception('Read-only mode is active!')
|
||||||
return self.__conn.execute( # type: ignore
|
return self.__conn.execute(
|
||||||
text(sql),
|
text(sql),
|
||||||
params if params is not None else {},
|
params if params is not None else {},
|
||||||
)
|
)
|
||||||
|
@ -12,7 +12,7 @@ Table for storing game settings that span multiple versions of the same
|
|||||||
game, such as play statistics. This table intentionally doesn't have a
|
game, such as play statistics. This table intentionally doesn't have a
|
||||||
key on game version, just game string and userid.
|
key on game version, just game string and userid.
|
||||||
"""
|
"""
|
||||||
game_settings = Table( # type: ignore
|
game_settings = Table(
|
||||||
'game_settings',
|
'game_settings',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
@ -25,7 +25,7 @@ game_settings = Table( # type: ignore
|
|||||||
"""
|
"""
|
||||||
Table for storing shop items that are server-side verified.
|
Table for storing shop items that are server-side verified.
|
||||||
"""
|
"""
|
||||||
catalog = Table( # type: ignore
|
catalog = Table(
|
||||||
'catalog',
|
'catalog',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
@ -42,7 +42,7 @@ Table for storing series achievements that span multiple versions of the same
|
|||||||
game, such as course scores. This table intentionally doesn't have a
|
game, such as course scores. This table intentionally doesn't have a
|
||||||
key on game version, just game string and userid.
|
key on game version, just game string and userid.
|
||||||
"""
|
"""
|
||||||
series_achievement = Table( # type: ignore
|
series_achievement = Table(
|
||||||
'series_achievement',
|
'series_achievement',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
@ -58,7 +58,7 @@ series_achievement = Table( # type: ignore
|
|||||||
Table for storing time-based game settings that aren't tied to a user
|
Table for storing time-based game settings that aren't tied to a user
|
||||||
account, such as dailies, weeklies, etc.
|
account, such as dailies, weeklies, etc.
|
||||||
"""
|
"""
|
||||||
time_sensitive_settings = Table( # type: ignore
|
time_sensitive_settings = Table(
|
||||||
'time_sensitive_settings',
|
'time_sensitive_settings',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
|
@ -14,7 +14,7 @@ Table for storing logistical information about a player who's session is
|
|||||||
live. Mostly, this is used to store IP addresses and such for players that
|
live. Mostly, this is used to store IP addresses and such for players that
|
||||||
could potentially match.
|
could potentially match.
|
||||||
"""
|
"""
|
||||||
playsession = Table( # type: ignore
|
playsession = Table(
|
||||||
'playsession',
|
'playsession',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -30,7 +30,7 @@ playsession = Table( # type: ignore
|
|||||||
"""
|
"""
|
||||||
Table for storing open lobbies for matching between games.
|
Table for storing open lobbies for matching between games.
|
||||||
"""
|
"""
|
||||||
lobby = Table( # type: ignore
|
lobby = Table(
|
||||||
'lobby',
|
'lobby',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
|
@ -13,7 +13,7 @@ with PCBID enforcement to ensure machines not authorized on the network are deni
|
|||||||
a connection. It is also used for settings such as port forwarding and which arcade
|
a connection. It is also used for settings such as port forwarding and which arcade
|
||||||
a machine belongs to for the purpose of PASELI balance.
|
a machine belongs to for the purpose of PASELI balance.
|
||||||
"""
|
"""
|
||||||
machine = Table( # type: ignore
|
machine = Table(
|
||||||
'machine',
|
'machine',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -32,7 +32,7 @@ machine = Table( # type: ignore
|
|||||||
Table for storing an arcade, to which zero or more machines may belong. This allows
|
Table for storing an arcade, to which zero or more machines may belong. This allows
|
||||||
an arcade to override some global settings such as PASELI enabled and infinite.
|
an arcade to override some global settings such as PASELI enabled and infinite.
|
||||||
"""
|
"""
|
||||||
arcade = Table( # type: ignore
|
arcade = Table(
|
||||||
'arcade',
|
'arcade',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -46,7 +46,7 @@ arcade = Table( # type: ignore
|
|||||||
"""
|
"""
|
||||||
Table for storing arcade ownership. This allows for more than one owner to own an arcade.
|
Table for storing arcade ownership. This allows for more than one owner to own an arcade.
|
||||||
"""
|
"""
|
||||||
arcade_owner = Table( # type: ignore
|
arcade_owner = Table(
|
||||||
'arcade_owner',
|
'arcade_owner',
|
||||||
metadata,
|
metadata,
|
||||||
Column('userid', BigInteger(unsigned=True), nullable=False),
|
Column('userid', BigInteger(unsigned=True), nullable=False),
|
||||||
@ -60,7 +60,7 @@ Table for storing arcade settings for a particular game/version. This allows the
|
|||||||
owner to change settings related to a particular game, such as the events active or the
|
owner to change settings related to a particular game, such as the events active or the
|
||||||
shop ranking courses.
|
shop ranking courses.
|
||||||
"""
|
"""
|
||||||
arcade_settings = Table( # type: ignore
|
arcade_settings = Table(
|
||||||
'arcade_settings',
|
'arcade_settings',
|
||||||
metadata,
|
metadata,
|
||||||
Column('arcadeid', Integer, nullable=False),
|
Column('arcadeid', Integer, nullable=False),
|
||||||
|
@ -19,7 +19,7 @@ Note that this is NOT keyed by game song id and chart, but by an internal musici
|
|||||||
managed by the music table. This is so we can support keeping the same score across
|
managed by the music table. This is so we can support keeping the same score across
|
||||||
multiple games, even if the game changes the ID it refers to the song by.
|
multiple games, even if the game changes the ID it refers to the song by.
|
||||||
"""
|
"""
|
||||||
score = Table( # type: ignore
|
score = Table(
|
||||||
'score',
|
'score',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -39,7 +39,7 @@ Table for storing score history for a particular game. Every entry that is store
|
|||||||
or updated in score will be written into this table as well, for looking up history
|
or updated in score will be written into this table as well, for looking up history
|
||||||
over time.
|
over time.
|
||||||
"""
|
"""
|
||||||
score_history = Table( # type: ignore
|
score_history = Table(
|
||||||
'score_history',
|
'score_history',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -63,7 +63,7 @@ NOTE that it is expected to see the same songid/chart present multiple times as
|
|||||||
as the game version changes. In this way, a song which is in multiple versions of
|
as the game version changes. In this way, a song which is in multiple versions of
|
||||||
the game can be found when playing each version.
|
the game can be found when playing each version.
|
||||||
"""
|
"""
|
||||||
music = Table( # type: ignore
|
music = Table(
|
||||||
'music',
|
'music',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, index=True),
|
Column('id', Integer, nullable=False, index=True),
|
||||||
|
@ -11,7 +11,7 @@ from bemani.data.types import News, Event, UserID, ArcadeID
|
|||||||
Table for storing network news, as edited by an admin. This is displayed
|
Table for storing network news, as edited by an admin. This is displayed
|
||||||
on the front page of the frontend of the network.
|
on the front page of the frontend of the network.
|
||||||
"""
|
"""
|
||||||
news = Table( # type: ignore
|
news = Table(
|
||||||
'news',
|
'news',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -25,7 +25,7 @@ news = Table( # type: ignore
|
|||||||
Table for storing scheduled work history, so that individual game code
|
Table for storing scheduled work history, so that individual game code
|
||||||
can determine if it should run scheduled work or not.
|
can determine if it should run scheduled work or not.
|
||||||
"""
|
"""
|
||||||
scheduled_work = Table( # type: ignore
|
scheduled_work = Table(
|
||||||
'scheduled_work',
|
'scheduled_work',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
@ -43,7 +43,7 @@ Table for storing audit entries, such as crashes, PCBID denials, daily
|
|||||||
song selection, etc. Anything that could be inspected later to verify
|
song selection, etc. Anything that could be inspected later to verify
|
||||||
correct operation of the network.
|
correct operation of the network.
|
||||||
"""
|
"""
|
||||||
audit = Table( # type: ignore
|
audit = Table(
|
||||||
'audit',
|
'audit',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
|
@ -19,7 +19,7 @@ and password are optional as a user does not need to create a web login
|
|||||||
to use the network. However, an active user account is required
|
to use the network. However, an active user account is required
|
||||||
before creating a web login.
|
before creating a web login.
|
||||||
"""
|
"""
|
||||||
user = Table( # type: ignore
|
user = Table(
|
||||||
'user',
|
'user',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', Integer, nullable=False, primary_key=True),
|
Column('id', Integer, nullable=False, primary_key=True),
|
||||||
@ -37,7 +37,7 @@ or more cards associated with them. When a new card is used in a game
|
|||||||
a new user will be created to associate with a card, but it can later
|
a new user will be created to associate with a card, but it can later
|
||||||
be unlinked.
|
be unlinked.
|
||||||
"""
|
"""
|
||||||
card = Table( # type: ignore
|
card = Table(
|
||||||
'card',
|
'card',
|
||||||
metadata,
|
metadata,
|
||||||
Column('id', String(16), nullable=False, unique=True),
|
Column('id', String(16), nullable=False, unique=True),
|
||||||
@ -49,7 +49,7 @@ card = Table( # type: ignore
|
|||||||
Table representing an extid for a user across a game series. Each game
|
Table representing an extid for a user across a game series. Each game
|
||||||
series on the network gets its own extid (8 digit number) for each user.
|
series on the network gets its own extid (8 digit number) for each user.
|
||||||
"""
|
"""
|
||||||
extid = Table( # type: ignore
|
extid = Table(
|
||||||
'extid',
|
'extid',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
@ -68,7 +68,7 @@ will be generated for the user.
|
|||||||
Note that a user might have an extid/refid for a game without a profile,
|
Note that a user might have an extid/refid for a game without a profile,
|
||||||
but a user cannot have a profile without an extid/refid.
|
but a user cannot have a profile without an extid/refid.
|
||||||
"""
|
"""
|
||||||
refid = Table( # type: ignore
|
refid = Table(
|
||||||
'refid',
|
'refid',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
@ -82,7 +82,7 @@ refid = Table( # type: ignore
|
|||||||
"""
|
"""
|
||||||
Table for storing JSON profile blobs, indexed by refid.
|
Table for storing JSON profile blobs, indexed by refid.
|
||||||
"""
|
"""
|
||||||
profile = Table( # type: ignore
|
profile = Table(
|
||||||
'profile',
|
'profile',
|
||||||
metadata,
|
metadata,
|
||||||
Column('refid', String(16), nullable=False, unique=True),
|
Column('refid', String(16), nullable=False, unique=True),
|
||||||
@ -96,7 +96,7 @@ with a unique ID and type. Games are free to store a JSON blob for each
|
|||||||
achievement. Examples would be tran medals, event unlocks, items earned,
|
achievement. Examples would be tran medals, event unlocks, items earned,
|
||||||
etc.
|
etc.
|
||||||
"""
|
"""
|
||||||
achievement = Table( # type: ignore
|
achievement = Table(
|
||||||
'achievement',
|
'achievement',
|
||||||
metadata,
|
metadata,
|
||||||
Column('refid', String(16), nullable=False),
|
Column('refid', String(16), nullable=False),
|
||||||
@ -115,7 +115,7 @@ you earn it. Games are free to store a JSON blob for each achievement and
|
|||||||
the blob does not need to be equal across different instances of the same
|
the blob does not need to be equal across different instances of the same
|
||||||
achievement for the same user. Examples would be calorie earnings for DDR.
|
achievement for the same user. Examples would be calorie earnings for DDR.
|
||||||
"""
|
"""
|
||||||
time_based_achievement = Table( # type: ignore
|
time_based_achievement = Table(
|
||||||
'time_based_achievement',
|
'time_based_achievement',
|
||||||
metadata,
|
metadata,
|
||||||
Column('refid', String(16), nullable=False),
|
Column('refid', String(16), nullable=False),
|
||||||
@ -131,7 +131,7 @@ time_based_achievement = Table( # type: ignore
|
|||||||
Table for storing a user's PASELI balance, given an arcade. There is no global
|
Table for storing a user's PASELI balance, given an arcade. There is no global
|
||||||
balance on this network.
|
balance on this network.
|
||||||
"""
|
"""
|
||||||
balance = Table( # type: ignore
|
balance = Table(
|
||||||
'balance',
|
'balance',
|
||||||
metadata,
|
metadata,
|
||||||
Column('userid', BigInteger(unsigned=True), nullable=False),
|
Column('userid', BigInteger(unsigned=True), nullable=False),
|
||||||
@ -146,7 +146,7 @@ Table for storing links between two users in a game/version, whatever that
|
|||||||
may be. Typically used for rivals.
|
may be. Typically used for rivals.
|
||||||
etc.
|
etc.
|
||||||
"""
|
"""
|
||||||
link = Table( # type: ignore
|
link = Table(
|
||||||
'link',
|
'link',
|
||||||
metadata,
|
metadata,
|
||||||
Column('game', String(32), nullable=False),
|
Column('game', String(32), nullable=False),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
|
|
||||||
from bemani.data import Data
|
from bemani.data import Data
|
||||||
from bemani.api import app, config # noqa: F401
|
from bemani.api import app, config # noqa: F401
|
||||||
@ -8,7 +8,7 @@ from bemani.api import app, config # noqa: F401
|
|||||||
def load_config(filename: str) -> None:
|
def load_config(filename: str) -> None:
|
||||||
global config
|
global config
|
||||||
|
|
||||||
config.update(yaml.safe_load(open(filename))) # type: ignore
|
config.update(yaml.safe_load(open(filename)))
|
||||||
config['database']['engine'] = Data.create_engine(config)
|
config['database']['engine'] = Data.create_engine(config)
|
||||||
|
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ def main() -> None:
|
|||||||
load_config(args.config)
|
load_config(args.config)
|
||||||
|
|
||||||
if args.profile:
|
if args.profile:
|
||||||
from werkzeug.contrib.profiler import ProfilerMiddleware # type: ignore
|
from werkzeug.contrib.profiler import ProfilerMiddleware
|
||||||
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir='.') # type: ignore
|
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir='.') # type: ignore
|
||||||
|
|
||||||
# Run the app
|
# Run the app
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import getpass
|
import getpass
|
||||||
import sys
|
import sys
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
from typing import Any, Dict, Optional
|
from typing import Any, Dict, Optional
|
||||||
|
|
||||||
from bemani.data import Data, DBCreateException
|
from bemani.data import Data, DBCreateException
|
||||||
@ -96,7 +96,7 @@ def main() -> None:
|
|||||||
parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml")
|
parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
config = yaml.safe_load(open(args.config)) # type: ignore
|
config = yaml.safe_load(open(args.config))
|
||||||
config['database']['engine'] = Data.create_engine(config)
|
config['database']['engine'] = Data.create_engine(config)
|
||||||
try:
|
try:
|
||||||
if args.operation == "create":
|
if args.operation == "create":
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
|
|
||||||
from bemani.backend.iidx import IIDXFactory
|
from bemani.backend.iidx import IIDXFactory
|
||||||
from bemani.backend.popn import PopnMusicFactory
|
from bemani.backend.popn import PopnMusicFactory
|
||||||
@ -76,7 +76,7 @@ def register_games() -> None:
|
|||||||
def load_config(filename: str) -> None:
|
def load_config(filename: str) -> None:
|
||||||
global config
|
global config
|
||||||
|
|
||||||
config.update(yaml.safe_load(open(filename))) # type: ignore
|
config.update(yaml.safe_load(open(filename)))
|
||||||
config['database']['engine'] = Data.create_engine(config)
|
config['database']['engine'] = Data.create_engine(config)
|
||||||
app.secret_key = config['secret_key']
|
app.secret_key = config['secret_key']
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ def main() -> None:
|
|||||||
register_games()
|
register_games()
|
||||||
|
|
||||||
if args.profile:
|
if args.profile:
|
||||||
from werkzeug.contrib.profiler import ProfilerMiddleware # type: ignore
|
from werkzeug.contrib.profiler import ProfilerMiddleware
|
||||||
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir='.') # type: ignore
|
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir='.') # type: ignore
|
||||||
|
|
||||||
# Run the app
|
# Run the app
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import requests
|
import requests
|
||||||
import socket
|
import socket
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
from flask import Flask, Response, request
|
from flask import Flask, Response, request
|
||||||
from typing import Any, Dict, Optional
|
from typing import Any, Dict, Optional
|
||||||
import urllib.parse as urlparse
|
import urllib.parse as urlparse
|
||||||
@ -180,7 +180,7 @@ def receive_request(path: str) -> Response:
|
|||||||
data=req_binary,
|
data=req_binary,
|
||||||
).prepare()
|
).prepare()
|
||||||
sess = requests.Session()
|
sess = requests.Session()
|
||||||
r = sess.send(prep_req, timeout=config['timeout']) # type: ignore
|
r = sess.send(prep_req, timeout=config['timeout'])
|
||||||
|
|
||||||
if r.status_code != 200:
|
if r.status_code != 200:
|
||||||
# Failed on remote side
|
# Failed on remote side
|
||||||
@ -233,7 +233,7 @@ def receive_request(path: str) -> Response:
|
|||||||
def load_proxy_config(filename: str) -> None:
|
def load_proxy_config(filename: str) -> None:
|
||||||
global config
|
global config
|
||||||
|
|
||||||
config_data = yaml.safe_load(open(filename)) # type: ignore
|
config_data = yaml.safe_load(open(filename))
|
||||||
if 'pcbid' in config_data and config_data['pcbid'] is not None:
|
if 'pcbid' in config_data and config_data['pcbid'] is not None:
|
||||||
for pcbid in config_data['pcbid']:
|
for pcbid in config_data['pcbid']:
|
||||||
remote_name = config_data['pcbid'][pcbid]
|
remote_name = config_data['pcbid'][pcbid]
|
||||||
@ -244,7 +244,7 @@ def load_proxy_config(filename: str) -> None:
|
|||||||
def load_config(filename: str) -> None:
|
def load_config(filename: str) -> None:
|
||||||
global config
|
global config
|
||||||
|
|
||||||
config_data = yaml.safe_load(open(filename)) # type: ignore
|
config_data = yaml.safe_load(open(filename))
|
||||||
config.update({
|
config.update({
|
||||||
'local_host': config_data['local']['host'],
|
'local_host': config_data['local']['host'],
|
||||||
'local_port': config_data['local']['port'],
|
'local_port': config_data['local']['port'],
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# vim: set fileencoding=utf-8
|
# vim: set fileencoding=utf-8
|
||||||
|
|
||||||
import csv # type: ignore
|
import csv
|
||||||
import argparse
|
import argparse
|
||||||
import copy
|
import copy
|
||||||
import io
|
import io
|
||||||
@ -9,7 +9,7 @@ import json
|
|||||||
import os
|
import os
|
||||||
import pefile # type: ignore
|
import pefile # type: ignore
|
||||||
import struct
|
import struct
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
from sqlalchemy import create_engine # type: ignore
|
from sqlalchemy import create_engine # type: ignore
|
||||||
from sqlalchemy.engine import CursorResult # type: ignore
|
from sqlalchemy.engine import CursorResult # type: ignore
|
||||||
@ -62,7 +62,7 @@ class ImportBase:
|
|||||||
self.no_combine = no_combine
|
self.no_combine = no_combine
|
||||||
self.__config = config
|
self.__config = config
|
||||||
self.__url = f"mysql://{config['database']['user']}:{config['database']['password']}@{config['database']['address']}/{config['database']['database']}?charset=utf8mb4"
|
self.__url = f"mysql://{config['database']['user']}:{config['database']['password']}@{config['database']['address']}/{config['database']['database']}?charset=utf8mb4"
|
||||||
self.__engine = create_engine(self.__url) # type: ignore
|
self.__engine = create_engine(self.__url)
|
||||||
self.__sessionmanager = sessionmaker(self.__engine)
|
self.__sessionmanager = sessionmaker(self.__engine)
|
||||||
self.__conn = self.__engine.connect()
|
self.__conn = self.__engine.connect()
|
||||||
self.__session = self.__sessionmanager(bind=self.__conn)
|
self.__session = self.__sessionmanager(bind=self.__conn)
|
||||||
@ -1438,7 +1438,7 @@ class ImportJubeat(ImportBase):
|
|||||||
raise Exception("Unsupported Jubeat version, expected one of the following: all")
|
raise Exception("Unsupported Jubeat version, expected one of the following: all")
|
||||||
|
|
||||||
with open(tsvfile, newline='') as tsvhandle:
|
with open(tsvfile, newline='') as tsvhandle:
|
||||||
jubeatreader = csv.reader(tsvhandle, delimiter='\t', quotechar='"') # type: ignore
|
jubeatreader = csv.reader(tsvhandle, delimiter='\t', quotechar='"')
|
||||||
for row in jubeatreader:
|
for row in jubeatreader:
|
||||||
songid = int(row[0])
|
songid = int(row[0])
|
||||||
name = row[1]
|
name = row[1]
|
||||||
@ -1787,7 +1787,7 @@ class ImportIIDX(ImportBase):
|
|||||||
raise Exception("Unsupported IIDX version, expected one of the following: all")
|
raise Exception("Unsupported IIDX version, expected one of the following: all")
|
||||||
|
|
||||||
with open(tsvfile, newline='') as tsvhandle:
|
with open(tsvfile, newline='') as tsvhandle:
|
||||||
iidxreader = csv.reader(tsvhandle, delimiter='\t', quotechar='"') # type: ignore
|
iidxreader = csv.reader(tsvhandle, delimiter='\t', quotechar='"')
|
||||||
for row in iidxreader:
|
for row in iidxreader:
|
||||||
songid = int(row[0])
|
songid = int(row[0])
|
||||||
name = row[1]
|
name = row[1]
|
||||||
@ -2586,7 +2586,7 @@ class ImportSDVX(ImportBase):
|
|||||||
csvdata = csvhandle.read().decode('shift_jisx0213')
|
csvdata = csvhandle.read().decode('shift_jisx0213')
|
||||||
|
|
||||||
csvstr = io.StringIO(csvdata)
|
csvstr = io.StringIO(csvdata)
|
||||||
appealreader = csv.reader(csvstr, delimiter=',', quotechar='"') # type: ignore
|
appealreader = csv.reader(csvstr, delimiter=',', quotechar='"')
|
||||||
for row in appealreader:
|
for row in appealreader:
|
||||||
appealids = []
|
appealids = []
|
||||||
if self.version == VersionConstants.SDVX_INFINITE_INFECTION:
|
if self.version == VersionConstants.SDVX_INFINITE_INFECTION:
|
||||||
@ -3436,7 +3436,7 @@ if __name__ == "__main__":
|
|||||||
raise Exception("Cannot specify both a remote server and a local file to read from!")
|
raise Exception("Cannot specify both a remote server and a local file to read from!")
|
||||||
|
|
||||||
# Load the config so we can talk to the server
|
# Load the config so we can talk to the server
|
||||||
config = yaml.safe_load(open(args.config)) # type: ignore
|
config = yaml.safe_load(open(args.config))
|
||||||
|
|
||||||
if args.series == GameConstants.POPN_MUSIC:
|
if args.series == GameConstants.POPN_MUSIC:
|
||||||
popn = ImportPopn(config, args.version, args.no_combine, args.update)
|
popn = ImportPopn(config, args.version, args.no_combine, args.update)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
from typing import Any, Dict, List
|
from typing import Any, Dict, List
|
||||||
|
|
||||||
from bemani.backend.popn import PopnMusicFactory
|
from bemani.backend.popn import PopnMusicFactory
|
||||||
@ -55,11 +55,11 @@ def run_scheduled_work(config: Dict[str, Any]) -> None:
|
|||||||
|
|
||||||
# First, run any backend scheduled work
|
# First, run any backend scheduled work
|
||||||
for factory in enabled_factories:
|
for factory in enabled_factories:
|
||||||
factory.run_scheduled_work(data, config) # type: ignore
|
factory.run_scheduled_work(data, config)
|
||||||
|
|
||||||
# Now, warm the caches for the frontend
|
# Now, warm the caches for the frontend
|
||||||
for cache in enabled_caches:
|
for cache in enabled_caches:
|
||||||
cache.preload(data, config) # type: ignore
|
cache.preload(data, config)
|
||||||
|
|
||||||
# Now, possibly delete old log entries
|
# Now, possibly delete old log entries
|
||||||
keep_duration = config.get('event_log_duration', 0)
|
keep_duration = config.get('event_log_duration', 0)
|
||||||
@ -75,7 +75,7 @@ if __name__ == '__main__':
|
|||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
# Set up global configuration
|
# Set up global configuration
|
||||||
config = yaml.safe_load(open(args.config)) # type: ignore
|
config = yaml.safe_load(open(args.config))
|
||||||
config['database']['engine'] = Data.create_engine(config)
|
config['database']['engine'] = Data.create_engine(config)
|
||||||
|
|
||||||
# Run out of band work
|
# Run out of band work
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import copy
|
import copy
|
||||||
import traceback
|
import traceback
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
from flask import Flask, request, redirect, Response, make_response
|
from flask import Flask, request, redirect, Response, make_response
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ def receive_request(path: str) -> Response:
|
|||||||
def load_config(filename: str) -> None:
|
def load_config(filename: str) -> None:
|
||||||
global config
|
global config
|
||||||
|
|
||||||
config.update(yaml.safe_load(open(filename))) # type: ignore
|
config.update(yaml.safe_load(open(filename)))
|
||||||
config['database']['engine'] = Data.create_engine(config)
|
config['database']['engine'] = Data.create_engine(config)
|
||||||
|
|
||||||
|
|
||||||
@ -168,7 +168,7 @@ if __name__ == '__main__':
|
|||||||
register_games()
|
register_games()
|
||||||
|
|
||||||
if args.profile:
|
if args.profile:
|
||||||
from werkzeug.contrib.profiler import ProfilerMiddleware # type: ignore
|
from werkzeug.contrib.profiler import ProfilerMiddleware
|
||||||
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir='.') # type: ignore
|
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir='.') # type: ignore
|
||||||
|
|
||||||
# Run the app
|
# Run the app
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import sys
|
import sys
|
||||||
from typing import Any, Dict, Optional
|
from typing import Any, Dict, Optional
|
||||||
import yaml # type: ignore
|
import yaml
|
||||||
|
|
||||||
from bemani.client import ClientProtocol, BaseClient
|
from bemani.client import ClientProtocol, BaseClient
|
||||||
from bemani.client.iidx import (
|
from bemani.client.iidx import (
|
||||||
@ -463,7 +463,7 @@ def mainloop(address: str, port: int, configfile: str, action: str, game: str, c
|
|||||||
print(f'Unknown game {game}')
|
print(f'Unknown game {game}')
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
config = yaml.safe_load(open(configfile)) # type: ignore
|
config = yaml.safe_load(open(configfile))
|
||||||
|
|
||||||
print(f'Emulating {games[game]["name"]}')
|
print(f'Emulating {games[game]["name"]}')
|
||||||
emu = get_client(
|
emu = get_client(
|
||||||
|
@ -34,6 +34,10 @@ done
|
|||||||
MYPYPATH=$(python -c "import os; print(os.path.realpath('.'))") mypy \
|
MYPYPATH=$(python -c "import os; print(os.path.realpath('.'))") mypy \
|
||||||
"${cmdline[@]}" \
|
"${cmdline[@]}" \
|
||||||
--warn-redundant-casts \
|
--warn-redundant-casts \
|
||||||
|
--warn-unused-ignores \
|
||||||
--disallow-untyped-calls \
|
--disallow-untyped-calls \
|
||||||
--disallow-untyped-defs \
|
--disallow-untyped-defs \
|
||||||
|
--disallow-subclassing-any \
|
||||||
|
--disallow-incomplete-defs \
|
||||||
|
--no-implicit-optional \
|
||||||
--no-strict-optional
|
--no-strict-optional
|
||||||
|
Loading…
Reference in New Issue
Block a user