Copyright | (c) Mansur Ziiatdinov 2018-2019 |
---|---|
License | BSD-3 |
Maintainer | chgk@pm.me |
Stability | experimental |
Portability | POSIX |
Safe Haskell | None |
Language | Haskell2010 |
RatingChgkInfo.Types
Contents
Description
Типы в этом модуле практически совпадают с теми, которые возвращаются сайтом рейтинга. Поэтому и проблемы у них (такие, как использование строк вместо целых и т.п.) общие. Часть этих проблем задокументирована при помощи пометок 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 | |
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: пустое отображение должно обозначаться {}
вместо []
Constructors
SeasonMap | |
Fields
|
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 вместо параметров путей
Игрок
Игрок
Constructors
Player | |
Fields
|
Instances
data PlayerTeam Source #
Игрок в базовом составе команды
Constructors
PlayerTeam | |
Fields
|
Instances
data PlayerSeason Source #
Турниры, сыгранные игроком в сезоне
Constructors
PlayerSeason | |
Fields
|
Instances
data PlayerTournament Source #
Турнир, сыгранный игроком
Constructors
PlayerTournament | |
Fields
|
Instances
data PlayerRating Source #
Рейтинг игрока
Constructors
PlayerRating | |
Fields
|
Instances
Команда
Команда
Constructors
Team | |
Fields
|
Instances
data TeamBaseRecap Source #
Базовый состав команды
Constructors
TeamBaseRecap | |
Fields
|
Instances
data TeamTournament Source #
Турниры, сыгранные командой в сезоне
Constructors
TeamTournament | |
Fields
|
Instances
data TeamRating Source #
Рейтинг команды
Constructors
TeamRating | |
Fields
|
Instances
Турнир
data TournamentShort Source #
Короткая информация о турнире (в списке турниров)
Constructors
TournamentShort | |
Fields
|
Instances
data Tournament Source #
Полная информация о турнире (по отдельному запросу)
Тип Tournament
можно было бы объединить с TournamentShort
, однако, в этом
случае бóльшая часть полей имела бы тип Maybe
x, что подразумевало бы
другой смысл, с менее строгой проверкой типов (некоторые поля могут быть
установлены, а некоторые нет). Поэтому было решено разделить эти два типа.
Сконвертировать Tournament
в TournamentShort
можно при помощи функции
tournamentToShort
.
В отличие от Tournament
в типах Player
и Team
есть единственное поле,
которое устанавливается в запросе более полной информации, поэтому эти типы
не разделены на два.
Constructors
Tournament | |
Fields
|
Instances
tournamentToShort :: Tournament -> TournamentShort Source #
Преобразует Tournament
в TournamentShort
, убирая лишние поля
data TournamentResult Source #
Результаты турнира для команды
Constructors
TournamentResult | |
Fields
|
Instances
data RecapPlayer Source #
Информация об игроке в составе команды на турнире
API NOTE. Так как игрок не может быть одновременно в базовом составе и легионером, нужно заменить эти два поля одним.
Constructors
RecapPlayer | |
Fields
|
Instances
data TourResult Source #
Результаты команды по турам
Constructors
TourResult | |
Instances
data Controversial Source #
Спорный
Constructors
Controversial | |
Fields
|
Instances
Апелляция
Constructors
Appeal | |
Fields
|
Instances
Типы-перечисления
data RatingFormula Source #
Формула рейтинга
Instances
Eq RatingFormula Source # | |
Defined in RatingChgkInfo.Types Methods (==) :: RatingFormula -> RatingFormula -> Bool # (/=) :: RatingFormula -> RatingFormula -> Bool # | |
Read RatingFormula Source # | |
Defined in RatingChgkInfo.Types Methods readsPrec :: Int -> ReadS RatingFormula # readList :: ReadS [RatingFormula] # | |
Show RatingFormula Source # | |
Defined in RatingChgkInfo.Types Methods showsPrec :: Int -> RatingFormula -> ShowS # show :: RatingFormula -> String # showList :: [RatingFormula] -> ShowS # | |
Generic RatingFormula Source # | |
Defined in RatingChgkInfo.Types Associated Types type Rep RatingFormula :: * -> * # | |
FromJSON RatingFormula Source # | |
Defined in RatingChgkInfo.Types | |
ToJSON RatingFormula Source # | |
Defined in RatingChgkInfo.Types Methods toJSON :: RatingFormula -> Value toEncoding :: RatingFormula -> Encoding toJSONList :: [RatingFormula] -> Value toEncodingList :: [RatingFormula] -> Encoding | |
type Rep RatingFormula Source # | |
data TournamentType Source #
Тип турнира
API NOTE: типа ""
(пустая строка) быть не должно. На данный момент (2019-01-13) таких турниров три: 2864, 2937, 2995. Типа Неизвестный
тоже быть не должно. Такой один: 2186
Constructors
Synchronous | Синхрон |
StrictlySynchronous | Строго синхронный |
Asynchronous | Асинхрон |
Casual | Обычный |
Regional | Региональный |
Marathon | Марафон |
TotalScore | Общий зачёт |
TypeUnknown | Неизвестный |
TypeEmpty | (пустая строка) |
Instances
data ClaimStatus Source #
Статус спорного или апелляции
Constructors
ClaimNew | Новый (N) |
ClaimAccepted | Принят (A) |
ClaimRejected | Отклонён (D) |
Instances
data AppealType Source #
Вид апелляции
Constructors
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
Заявка на проведение
Constructors
Request | |
Fields
|
Instances
Название команды на турнире
Constructors
TeamName | |
Fields
|