import db_sqlite, json, httpclient, os, strutils, times, time/gotime const ISOTime*: string = "yyyy-MM-dd'T'HH:mm:ss'+'zzz" version: string = staticExec "git describe --tags --long" type Tweet* = object of RootObj date*: TimeInfo message*: string username*: string proc `$`*(t: Tweet): string = return t.date.format(ISOTime) & " " & t.message proc `%`*(t: Tweet): JsonNode = %* { "date": t.date.format(ISOTime), "message": t.message, "username": t.username, } proc `%`*(s: seq[Tweet]): JsonNode = result = newJArray() for t in s.items(): result.add %t proc parseTweet*(user, inp: string): Tweet = let splitTweet = inp.split '\t' if splitTweet.len != 2: raise newException(ValueError, "Invalid tweet") let tdate = splitTweet[0].parseTime message = splitTweet[1] Tweet(date: tdate, message: message, username: user) proc fromDBRow*(r: Row): Tweet = Tweet(date: r[2].split(".")[0].parseInt().fromSeconds().timeToTimeInfo(), username: r[1], message: r[3]) proc getTweetsFrom*(url: string, username: string): seq[Tweet] = var res = newSeq[Tweet]() let body = url.getContent(timeout=20_000, userAgent = "twtxtlist/" & version & " (+https://xena.greedo.xeserv.us/files/xena.txt; @xena)") for line in body.splitLines().items(): if line.len > 0 and line[0] != '#': try: res.add(username.parseTweet(line)) except: echo username & " " & getCurrentExceptionMsg() return res proc updateTweetsByUser*(db: DBConn, username, url: string) {. gcsafe .} = try: let tweets = getTweetsFrom(url, username) for tweet in tweets.items(): try: db.exec(sql"insert into tweets values(null, ?, ?, ?);", username, tweet.date.timeInfoToTime().toSeconds().int(), tweet.message) except: discard except: echo username & " " & getCurrentExceptionMsg()