import db_sqlite, json, httpclient, os, strutils, times, time/gotime const ISOTime*: string = "yyyy-MM-dd'T'HH:mm:ss'.000000'zzz" type Tweet* = object of RootObj date*: TimeInfo message*: string username*: string proc `$`*(t: Tweet): string = return t.date.format(ISOTime) & "\t" & 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) for line in body.splitLines().items(): if line.len > 0: res.add(username.parseTweet(line)) return res proc updateTweetsOnce*() {. gcsafe .} = var db = open("./data/twtxt.db", nil, nil, nil) var users = db.getAllRows sql"select * from users where username != 'system'" for user in users.items(): echo "updating " & $user try: let username = user[1] url = user[2] 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: discard