nitter/src/types.nim

258 lines
5.0 KiB
Nim

# SPDX-License-Identifier: AGPL-3.0-only
import times, sequtils, options, tables
import prefs_impl
genPrefsType()
type
RateLimitError* = object of CatchableError
InternalError* = object of CatchableError
Api* {.pure.} = enum
userShow
timeline
search
tweet
list
listBySlug
listMembers
userRestId
status
RateLimit* = object
remaining*: int
reset*: int
Token* = ref object
tok*: string
init*: Time
lastUse*: Time
pending*: int
apis*: Table[Api, RateLimit]
Error* = enum
null = 0
noUserMatches = 17
protectedUser = 22
couldntAuth = 32
doesntExist = 34
userNotFound = 50
suspended = 63
rateLimited = 88
invalidToken = 89
listIdOrSlug = 112
tweetNotFound = 144
forbidden = 200
badToken = 239
noCsrf = 353
User* = object
id*: string
username*: string
fullname*: string
location*: string
website*: string
bio*: string
userPic*: string
banner*: string
pinnedTweet*: int64
following*: int
followers*: int
tweets*: int
likes*: int
media*: int
verified*: bool
protected*: bool
suspended*: bool
joinDate*: DateTime
VideoType* = enum
m3u8 = "application/x-mpegURL"
mp4 = "video/mp4"
vmap = "video/vmap"
VideoVariant* = object
contentType*: VideoType
url*: string
bitrate*: int
Video* = object
durationMs*: int
url*: string
thumb*: string
views*: string
available*: bool
reason*: string
title*: string
description*: string
playbackType*: VideoType
variants*: seq[VideoVariant]
QueryKind* = enum
posts, replies, media, users, tweets, userList
Query* = object
kind*: QueryKind
text*: string
filters*: seq[string]
includes*: seq[string]
excludes*: seq[string]
fromUser*: seq[string]
since*: string
until*: string
near*: string
sep*: string
Gif* = object
url*: string
thumb*: string
GalleryPhoto* = object
url*: string
tweetId*: string
color*: string
PhotoRail* = seq[GalleryPhoto]
Poll* = object
options*: seq[string]
values*: seq[int]
votes*: int
leader*: int
status*: string
CardKind* = enum
amplify = "amplify"
app = "app"
appPlayer = "appplayer"
player = "player"
summary = "summary"
summaryLarge = "summary_large_image"
promoWebsite = "promo_website"
promoVideo = "promo_video_website"
promoVideoConvo = "promo_video_convo"
promoImageConvo = "promo_image_convo"
promoImageApp = "promo_image_app"
storeLink = "direct_store_link_app"
liveEvent = "live_event"
broadcast = "broadcast"
periscope = "periscope_broadcast"
unified = "unified_card"
moment = "moment"
messageMe = "message_me"
videoDirectMessage = "video_direct_message"
imageDirectMessage = "image_direct_message"
audiospace = "audiospace"
newsletterPublication = "newsletter_publication"
unknown
Card* = object
kind*: CardKind
url*: string
title*: string
dest*: string
text*: string
image*: string
video*: Option[Video]
TweetStats* = object
replies*: int
retweets*: int
likes*: int
quotes*: int
Tweet* = ref object
id*: int64
threadId*: int64
replyId*: int64
user*: User
text*: string
time*: DateTime
reply*: seq[string]
pinned*: bool
hasThread*: bool
available*: bool
tombstone*: string
location*: string
source*: string
stats*: TweetStats
retweet*: Option[Tweet]
attribution*: Option[User]
mediaTags*: seq[User]
quote*: Option[Tweet]
card*: Option[Card]
poll*: Option[Poll]
gif*: Option[Gif]
video*: Option[Video]
photos*: seq[string]
Result*[T] = object
content*: seq[T]
top*, bottom*: string
beginning*: bool
query*: Query
Chain* = object
content*: seq[Tweet]
hasMore*: bool
cursor*: string
Conversation* = ref object
tweet*: Tweet
before*: Chain
after*: Chain
replies*: Result[Chain]
Timeline* = Result[Tweet]
Profile* = object
user*: User
photoRail*: PhotoRail
pinned*: Option[Tweet]
tweets*: Timeline
List* = object
id*: string
name*: string
userId*: string
username*: string
description*: string
members*: int
banner*: string
GlobalObjects* = ref object
tweets*: Table[string, Tweet]
users*: Table[string, User]
Config* = ref object
address*: string
port*: int
useHttps*: bool
httpMaxConns*: int
title*: string
hostname*: string
staticDir*: string
hmacKey*: string
base64Media*: bool
minTokens*: int
enableRss*: bool
enableDebug*: bool
proxy*: string
proxyAuth*: string
rssCacheTime*: int
listCacheTime*: int
redisHost*: string
redisPort*: int
redisConns*: int
redisMaxConns*: int
redisPassword*: string
Rss* = object
feed*, cursor*: string
proc contains*(thread: Chain; tweet: Tweet): bool =
thread.content.anyIt(it.id == tweet.id)