Copyright | (c) Mansur Ziiatdinov 2018-2019 |
---|---|
License | BSD-3 |
Maintainer | chgk@pm.me |
Stability | experimental |
Portability | POSIX |
Safe Haskell | None |
Language | Haskell2010 |
Типы в этом модуле практически совпадают с теми, которые возвращаются сайтом рейтинга. Поэтому и проблемы у них (такие, как использование строк вместо целых и т.п.) общие. Часть этих проблем задокументирована при помощи пометок API NOTE.
Возможно, в следующих версиях библиотеки будут какие-то способы обезопасить себя от ошибок, либо (надеюсь) в результате развития API сайта рейтинга, либо без этого.
Synopsis
- type RatingClient = ClientM
- data Items a = Items {}
- newtype SeasonMap a = SeasonMap {
- unSeasonMap :: Map Int a
- type RatingApi = ("players" :> (QueryParam "page" Int :> Get '[JSON] (Items Player))) :<|> (("players" :> (Capture "idplayer" PlayerId :> Get '[JSON] [Player])) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("teams" :> Get '[JSON] [PlayerTeam]))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("teams" :> ("last" :> Get '[JSON] [PlayerTeam])))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("teams" :> (Capture "idseason" Int :> Get '[JSON] [PlayerTeam])))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("tournaments" :> Get '[JSON] (SeasonMap PlayerSeason)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("tournaments" :> ("last" :> Get '[JSON] PlayerSeason)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("tournaments" :> (Capture "idseason" Int :> Get '[JSON] PlayerSeason)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("rating" :> Get '[JSON] [PlayerRating]))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("rating" :> ("last" :> Get '[JSON] PlayerRating)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("rating" :> (Capture "idrelease" Int :> Get '[JSON] PlayerRating)))) :<|> (("teams" :> (QueryParam "page" Int :> Get '[JSON] (Items Team))) :<|> (("teams" :> (Capture "idteam" TeamId :> Get '[JSON] [Team])) :<|> (("teams" :> (Capture "idteam" TeamId :> ("recaps" :> Get '[JSON] (SeasonMap TeamBaseRecap)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("recaps" :> ("last" :> Get '[JSON] TeamBaseRecap)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("recaps" :> (Capture "idseason" Int :> Get '[JSON] TeamBaseRecap)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("tournaments" :> Get '[JSON] (SeasonMap TeamTournament)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("tournaments" :> ("last" :> Get '[JSON] TeamTournament)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("tournaments" :> (Capture "idseason" Int :> Get '[JSON] TeamTournament)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> Get '[JSON] [TeamRating]))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> ("a" :> Get '[JSON] TeamRating)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> ("b" :> Get '[JSON] TeamRating)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> (Capture "idrelease" Int :> Get '[JSON] TeamRating)))) :<|> (("tournaments" :> (QueryParam "page" Int :> Get '[JSON] (Items TournamentShort))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> Get '[JSON] [Tournament])) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> Get '[JSON] [TournamentResult]))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> ("town" :> (Capture "idtown" Int :> Get '[JSON] [TournamentResult]))))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> ("region" :> (Capture "idregion" Int :> Get '[JSON] [TournamentResult]))))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> ("country" :> (Capture "idcountry" Int :> Get '[JSON] [TournamentResult]))))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("recaps" :> (Capture "idteam" TeamId :> Get '[JSON] [RecapPlayer])))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("results" :> (Capture "idteam" TeamId :> Get '[JSON] [TourResult])))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("controversials" :> Get '[JSON] [Controversial]))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("appeals" :> Get '[JSON] [Appeal]))) :<|> (("teams" :> ("search" :> (QueryParam "name" Text :> (QueryParam "town" Text :> (QueryParam "region_name" Text :> (QueryParam "country_name" Text :> (QueryFlag "active_this_season" :> (QueryParam "page" Int :> Get '[JSON] (Items Team))))))))) :<|> ("players" :> ("search" :> (QueryParam "surname" Text :> (QueryParam "name" Text :> (QueryParam "patronymic" Text :> (QueryParam "page" Int :> Get '[JSON] (Items Player))))))))))))))))))))))))))))))))))))))))
- data Player = Player {}
- data PlayerTeam = PlayerTeam {}
- data PlayerSeason = PlayerSeason {}
- data PlayerTournament = PlayerTournament {}
- data PlayerRating = PlayerRating {}
- data Team = Team {}
- data TeamBaseRecap = TeamBaseRecap {
- tbr_idteam :: TeamId
- tbr_idseason :: Text
- tbr_players :: [Text]
- tbr_captain :: Text
- data TeamTournament = TeamTournament {
- tt_idteam :: TeamId
- tt_idseason :: Text
- tt_tournaments :: [Text]
- data TeamRating = TeamRating {}
- data TournamentShort = TournamentShort {}
- data Tournament = Tournament {
- trn_idtournament :: TournamentId
- trn_name :: Text
- trn_town :: Text
- trn_longName :: Text
- trn_dateStart :: LocalTime
- trn_dateEnd :: LocalTime
- trn_tournamentInRating :: Text
- trn_tourCount :: Text
- trn_tourQuestions :: Text
- trn_tourQuestPerTour :: Maybe Text
- trn_questionsTotal :: Text
- trn_typeName :: TournamentType
- trn_mainPaymentValue :: Text
- trn_mainPaymentCurrency :: Text
- trn_discountedPaymentValue :: Text
- trn_discountedPaymentCurrency :: Text
- trn_discountedPaymentReason :: Text
- trn_dateRequestsAllowedTo :: Text
- trn_comment :: Text
- trn_siteUrl :: Text
- tournamentToShort :: Tournament -> TournamentShort
- data TournamentResult = TournamentResult {}
- data RecapPlayer = RecapPlayer {}
- data TourResult = TourResult {}
- data Controversial = Controversial {}
- data Appeal = Appeal {}
- data RatingFormula
- data TournamentType
- data ClaimStatus
- data AppealType
- data PlayerId
- data TeamId
- data TournamentId
- data Request = Request {}
- data TeamName = TeamName {
- tnTeamId :: Int
- tnCurrentName :: Text
- tnCurrentTown :: Text
- tnBaseName :: Text
- tnBaseTown :: Text
Работа с API
В этом разделе описаны типы, используемые при запросах к предоставляемому сайтом рейтинга REST API
type RatingClient = ClientM Source #
Синоним типа для реэкспорта. Монада, в которой возможно выполнять запросы к REST API сайта рейтинга
Общие типы
Список элементов с общим количеством для разбиения на страницы
Instances
Eq a => Eq (Items a) Source # | |
Read a => Read (Items a) Source # | |
Show a => Show (Items a) Source # | |
Generic (Items a) Source # | |
FromJSON a => FromJSON (Items a) Source # | |
Defined in RatingChgkInfo.Types parseJSON :: Value -> Parser (Items a) parseJSONList :: Value -> Parser [Items a] | |
type Rep (Items a) Source # | |
Defined in RatingChgkInfo.Types type Rep (Items a) = D1 (MetaData "Items" "RatingChgkInfo.Types" "rating-chgk-info-0.3.6.3-L3fn8G9bhO67ivFbJiA3rV" False) (C1 (MetaCons "Items" PrefixI True) (S1 (MetaSel (Just "total") NoSourceUnpackedness NoSourceStrictness DecidedStrict) (Rec0 Int) :*: S1 (MetaSel (Just "items") NoSourceUnpackedness NoSourceStrictness DecidedStrict) (Rec0 [a]))) |
Отображение сезонов на элементы
API NOTE: пустое отображение должно обозначаться {}
вместо []
SeasonMap | |
|
Instances
Eq a => Eq (SeasonMap a) Source # | |
Read a => Read (SeasonMap a) Source # | |
Show a => Show (SeasonMap a) Source # | |
Generic (SeasonMap a) Source # | |
FromJSON a => FromJSON (SeasonMap a) Source # | |
Defined in RatingChgkInfo.Types parseJSON :: Value -> Parser (SeasonMap a) parseJSONList :: Value -> Parser [SeasonMap a] | |
type Rep (SeasonMap a) Source # | |
Defined in RatingChgkInfo.Types |
type RatingApi = ("players" :> (QueryParam "page" Int :> Get '[JSON] (Items Player))) :<|> (("players" :> (Capture "idplayer" PlayerId :> Get '[JSON] [Player])) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("teams" :> Get '[JSON] [PlayerTeam]))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("teams" :> ("last" :> Get '[JSON] [PlayerTeam])))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("teams" :> (Capture "idseason" Int :> Get '[JSON] [PlayerTeam])))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("tournaments" :> Get '[JSON] (SeasonMap PlayerSeason)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("tournaments" :> ("last" :> Get '[JSON] PlayerSeason)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("tournaments" :> (Capture "idseason" Int :> Get '[JSON] PlayerSeason)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("rating" :> Get '[JSON] [PlayerRating]))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("rating" :> ("last" :> Get '[JSON] PlayerRating)))) :<|> (("players" :> (Capture "idplayer" PlayerId :> ("rating" :> (Capture "idrelease" Int :> Get '[JSON] PlayerRating)))) :<|> (("teams" :> (QueryParam "page" Int :> Get '[JSON] (Items Team))) :<|> (("teams" :> (Capture "idteam" TeamId :> Get '[JSON] [Team])) :<|> (("teams" :> (Capture "idteam" TeamId :> ("recaps" :> Get '[JSON] (SeasonMap TeamBaseRecap)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("recaps" :> ("last" :> Get '[JSON] TeamBaseRecap)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("recaps" :> (Capture "idseason" Int :> Get '[JSON] TeamBaseRecap)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("tournaments" :> Get '[JSON] (SeasonMap TeamTournament)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("tournaments" :> ("last" :> Get '[JSON] TeamTournament)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("tournaments" :> (Capture "idseason" Int :> Get '[JSON] TeamTournament)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> Get '[JSON] [TeamRating]))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> ("a" :> Get '[JSON] TeamRating)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> ("b" :> Get '[JSON] TeamRating)))) :<|> (("teams" :> (Capture "idteam" TeamId :> ("rating" :> (Capture "idrelease" Int :> Get '[JSON] TeamRating)))) :<|> (("tournaments" :> (QueryParam "page" Int :> Get '[JSON] (Items TournamentShort))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> Get '[JSON] [Tournament])) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> Get '[JSON] [TournamentResult]))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> ("town" :> (Capture "idtown" Int :> Get '[JSON] [TournamentResult]))))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> ("region" :> (Capture "idregion" Int :> Get '[JSON] [TournamentResult]))))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("list" :> ("country" :> (Capture "idcountry" Int :> Get '[JSON] [TournamentResult]))))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("recaps" :> (Capture "idteam" TeamId :> Get '[JSON] [RecapPlayer])))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("results" :> (Capture "idteam" TeamId :> Get '[JSON] [TourResult])))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("controversials" :> Get '[JSON] [Controversial]))) :<|> (("tournaments" :> (Capture "idtournament" TournamentId :> ("appeals" :> Get '[JSON] [Appeal]))) :<|> (("teams" :> ("search" :> (QueryParam "name" Text :> (QueryParam "town" Text :> (QueryParam "region_name" Text :> (QueryParam "country_name" Text :> (QueryFlag "active_this_season" :> (QueryParam "page" Int :> Get '[JSON] (Items Team))))))))) :<|> ("players" :> ("search" :> (QueryParam "surname" Text :> (QueryParam "name" Text :> (QueryParam "patronymic" Text :> (QueryParam "page" Int :> Get '[JSON] (Items Player)))))))))))))))))))))))))))))))))))))))) Source #
Тип, описывающий API сайта рейтинга. Функции, которые позволяют делать запросы к API, находятся в модуле RatingChgkInfo.Api
Некоторые замечания по общему дизайну API:
- API NOTE: в запросах
/players/:id
,/tournaments/:id
и некоторых других должен возвращаться единственный результат вместо списка из одного результата - API NOTE: в запросе
/players/:id/teams
и других запросах, возвращающие элементы по сезонам, следует возвращать список вместо отображения номера сезона на элемент (идентификатор сезона дублируется в самом элементе) - API NOTE: запросы, возвращающие элементы по сезонам, и запрос
/tournaments/:tourn/results/:team
устроены по-разному - API NOTE: запрос
/teams/:id/rating/:formula
, по-видимому, несколько сломан: для команды 1 он возвращает пустую строку (по состоянию на 2019-01-11) - API NOTE: запрос
/players/:id/rating/last
, по-видимому, нсколько сломан: для игрока 54345 он возвращает пустую строку (по состоянию на 2019-01-11) - API NOTE: запросы
/tournament/:id/town/:town
должны использовать QueryParam вместо параметров путей
Игрок
Игрок
Player | |
|
Instances
data PlayerTeam Source #
Игрок в базовом составе команды
PlayerTeam | |
|
Instances
data PlayerSeason Source #
Турниры, сыгранные игроком в сезоне
PlayerSeason | |
|
Instances
data PlayerTournament Source #
Турнир, сыгранный игроком
PlayerTournament | |
|
Instances
data PlayerRating Source #
Рейтинг игрока
PlayerRating | |
|
Instances
Команда
Команда
Team | |
|
Instances
data TeamBaseRecap Source #
Базовый состав команды
TeamBaseRecap | |
|
Instances
data TeamTournament Source #
Турниры, сыгранные командой в сезоне
TeamTournament | |
|
Instances
data TeamRating Source #
Рейтинг команды
TeamRating | |
|
Instances
Турнир
data TournamentShort Source #
Короткая информация о турнире (в списке турниров)
TournamentShort | |
|
Instances
data Tournament Source #
Полная информация о турнире (по отдельному запросу)
Тип Tournament
можно было бы объединить с TournamentShort
, однако, в этом
случае бóльшая часть полей имела бы тип Maybe
x, что подразумевало бы
другой смысл, с менее строгой проверкой типов (некоторые поля могут быть
установлены, а некоторые нет). Поэтому было решено разделить эти два типа.
Сконвертировать Tournament
в TournamentShort
можно при помощи функции
tournamentToShort
.
В отличие от Tournament
в типах Player
и Team
есть единственное поле,
которое устанавливается в запросе более полной информации, поэтому эти типы
не разделены на два.
Tournament | |
|
Instances
tournamentToShort :: Tournament -> TournamentShort Source #
Преобразует Tournament
в TournamentShort
, убирая лишние поля
data TournamentResult Source #
Результаты турнира для команды
TournamentResult | |
|
Instances
data RecapPlayer Source #
Информация об игроке в составе команды на турнире
API NOTE. Так как игрок не может быть одновременно в базовом составе и легионером, нужно заменить эти два поля одним.
RecapPlayer | |
|
Instances
data TourResult Source #
Результаты команды по турам
Instances
data Controversial Source #
Спорный
Controversial | |
|
Instances
Апелляция
Appeal | |
|
Instances
Типы-перечисления
data RatingFormula Source #
Формула рейтинга
Instances
data TournamentType Source #
Тип турнира
API NOTE: типа ""
(пустая строка) быть не должно. На данный момент (2019-01-13) таких турниров три: 2864, 2937, 2995. Типа Неизвестный
тоже быть не должно. Такой один: 2186
Synchronous | Синхрон |
StrictlySynchronous | Строго синхронный |
Asynchronous | Асинхрон |
Casual | Обычный |
Regional | Региональный |
Marathon | Марафон |
TotalScore | Общий зачёт |
TypeUnknown | Неизвестный |
TypeEmpty | (пустая строка) |
Instances
data ClaimStatus Source #
Статус спорного или апелляции
ClaimNew | Новый (N) |
ClaimAccepted | Принят (A) |
ClaimRejected | Отклонён (D) |
Instances
data AppealType Source #
Вид апелляции
AppealApprove | Апелляция на зачёт ответа (A) |
AppealRemove | Апелляция на снятие вопроса (R) |
AppealNarrator | Апелляция на снятие из-за ошибки ведущего (N) |
Instances
Типы для идентификаторов
Экспортируются без функций, позволяющих вытащить данные из типа, поскольку предполагается, что идентификаторы получаются только из запросов к серверу. Это должно помочь избежать ошибок, когда идентификатор одного типа (например, id игрока) ошибочно передаётся туда, где ожидается идентификатор другого типа (например, id турнира). Если вам совершенно точно без этого не обойтись, используйте модуль RatingChgkInfo.Types.Unsafe.
Идентификатор игрока. В API на самом деле возвращается строка, но во всех функциях работы с игроками используется этот тип. Чтобы получить значение этого типа следует получить данные из API
Instances
Идентификатор команды. В API на самом деле возвращается строка, но во всех функциях работы с командами используется этот тип. Чтобы получить значение этого типа следует получить данные из API
Instances
data TournamentId Source #
Идентификатор турнира. В API на самом деле возвращается строка, но во всех функциях работы с турнирами используется этот тип. Чтобы получить значение этого типа следует получить данные из API
Instances
Работа без API
В этом разделе - типы, которые используются при запросах к CSV-таблицам на сайте рейтинга для функциональности, которая (надеюсь, пока) не предоставляется через REST API
Функции для работы с этими типами находятся в модуле RatingChgkInfo.NoApi
Заявка на проведение
Request | |
|
Instances
Название команды на турнире
TeamName | |
|