| 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
| |