module Web.Tweet.Utils (
hits
, hits'
, getTweets
, displayTimeline
, displayTimelineColor
, lineByKey
, bird
, getConfigData
, filterQuotes
, filterReplies
, filterRTs
) where
import Control.Composition
import qualified Data.ByteString as BS2
import qualified Data.ByteString.Char8 as BS
import Data.List
import Data.List.Extra
import Data.Void
import Lens.Micro.Extras
import Text.Megaparsec
import Web.Tweet.Parser
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 (ParseErrorBundle String Void) Timeline
getTweets = parse parseTweet "" . BS.unpack
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