module Web.Tweet.Utils (
hits
, hits'
, getTweetsFast
, getTweets
, displayTimeline
, displayTimelineColor
, lineByKey
, bird
, getConfigData
, filterQuotes
, filterReplies
, filterRTs
) where
import Control.Composition
import Control.Lens hiding (noneOf)
import qualified Data.ByteString as BS2
import qualified Data.ByteString.Char8 as BS
import Data.List
import Data.List.Extra
import Data.Void
import Text.Megaparsec
import Web.Tweet.Parser
import Web.Tweet.Parser.FastParser hiding (text)
import Web.Tweet.Types
import Web.Tweet.Utils.Colors
hits :: Timeline -> Timeline
hits = sortTweets . filterRTs
hits' :: Timeline -> Timeline
hits' = hits . filterReplies
filterRTs :: Timeline -> Timeline
filterRTs = filter ((/="RT @") . take 4 . view text)
filterReplies :: Timeline -> Timeline
filterReplies = filter ((/="@") . take 1 . view text)
filterQuotes :: Timeline -> Timeline
filterQuotes = filter ((==Nothing) . view quoted)
getTweets :: BS2.ByteString -> Either (ParseError Char Void) Timeline
getTweets = parse parseTweet "" . BS.unpack
getTweetsFast :: BS2.ByteString -> Either String Timeline
getTweetsFast = fmap (fmap fromFast) . fastParse
displayTimeline :: Timeline -> String
displayTimeline (TweetEntity content u sn idTweet _ Nothing rts fave:rest) = concat [u
, " ("
, sn
, ")"
,":\n "
,fixNewline content
,"\n "
, "💜"
,show fave
, " \61561 "
,show rts
, " "
, show idTweet
,"\n\n"
,displayTimeline rest]
displayTimeline (TweetEntity content u sn idTweet _ (Just q) rts fave:rest) = concat [u
, " ("
, sn
, ")"
, ":\n "
, fixNewline content
, "\n "
, "💜"
, show fave
, " \61561 "
, show rts
, " "
, show idTweet
, "\n "
, _name q
, " ("
, _screenName q
, ")"
, ": "
, _text q
, "\n\n"
, displayTimeline rest]
displayTimeline [] = []
bird :: String
bird = toPlainBlue "🐦\n"
displayTimelineColor :: Timeline -> String
displayTimelineColor (TweetEntity content u sn idTweet _ Nothing rts fave:rest) = concat [toYellow u
, " ("
, sn
, ")"
, ":\n "
, fixNewline content
, "\n "
, toRed "💜"
, " "
, show fave
, toGreen " \61561 "
, show rts
, " "
, toBlue (show idTweet)
, "\n\n"
, displayTimelineColor rest]
displayTimelineColor (TweetEntity content u sn idTweet _ (Just q) rts fave:rest) = concat [toYellow u
, " ("
, sn
, ")"
, ":\n "
, fixNewline content
, "\n "
, toRed "💜"
, " "
, show fave
, toGreen " \61561 "
, show rts
, " "
, toBlue (show idTweet)
, "\n "
, toYellow $ _name q
, " ("
, _screenName q
, ")"
, ": "
, _text q
, "\n\n"
, displayTimelineColor rest]
displayTimelineColor [] = []
fixNewline :: String -> String
fixNewline = replace "\n" "\n "
sortTweets :: Timeline -> Timeline
sortTweets = sortBy compareTweet
where compareTweet (TweetEntity _ _ _ _ _ _ r1 f1) (TweetEntity _ _ _ _ _ _ r2 f2) = compare (2*r2 + f2) (2*r1 + f1)
keyLinePie :: String -> String
keyLinePie = takeWhile (/=':')
lineByKey :: BS.ByteString -> [(BS.ByteString, BS.ByteString)] -> BS.ByteString
lineByKey = snd .* head .* (filter . (fst -.* (==)))
filterLine :: String -> String
filterLine = reverse . takeWhile (not . (`elem` (" :" :: String))) . reverse
getConfigData :: FilePath -> IO [(BS.ByteString, BS.ByteString)]
getConfigData filepath = zip <$> keys <*> content
where content = map (BS.pack . filterLine) . lines <$> file
keys = map (BS.pack . keyLinePie) . lines <$> file
file = readFile filepath