Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | hlint changes
- Duplication between curldelete and curlput still exists, but I think is |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | origin/issue1 | trunk | master |
| Files: | files | file ages | folders |
| SHA3-256: |
6b4d755c96bb515aae4b3f462c6aa73d |
| User & Date: | base@atomicules.co.uk 2016-12-04 15:09:43 |
Context
|
2016-12-04
| ||
| 15:43 | Be consistent with how isInfixOf is used check-in: bec4f0a542 user: base@atomicules.co.uk tags: master, origin/issue1, trunk | |
| 15:09 |
hlint changes
- Duplication between curldelete and curlput still exists, but I think is | |
|
2016-12-03
| ||
| 00:07 | Update README to reflect it works again check-in: 02acc587fc user: base@atomicules.co.uk tags: master, origin/issue1, trunk | |
Changes
Changes to haskerdeux.hs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{-# LANGUAGE DeriveDataTypeable #-}
--HaskerDeux
import System.Environment
import System.IO
import System.IO.Error
import System.Process
import Data.List
import Data.List.Split --need to install
import Data.Map
import Control.Monad
import Data.Maybe
import Text.JSON --need to install for JSON
import Text.JSON.Generic --need to install for JSON
import Data.Time
import System.Time
import System.Locale (defaultTimeLocale)
import System.Directory
| > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{-# LANGUAGE DeriveDataTypeable #-}
--HaskerDeux
import System.Environment
import System.IO
import System.IO.Error
import System.Process
import Data.List
import Data.List.Split --need to install
import Data.Map
import Control.Monad
import Control.Applicative
import Data.Maybe
import Text.JSON --need to install for JSON
import Text.JSON.Generic --need to install for JSON
import Data.Time
import System.Time
import System.Locale (defaultTimeLocale)
import System.Directory
|
| ︙ | ︙ | |||
28 29 30 31 32 33 34 | dispatch "delete" = remove main = do time <- getClockTime >>= toCalendarTime --https://wiki.haskell.org/Unix_tools/Date let todays_date = formatCalendarTime defaultTimeLocale "%Y-%m-%d" time (command:argList) <- getArgs | | < | | | | < < < | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | dispatch "delete" = remove main = do time <- getClockTime >>= toCalendarTime --https://wiki.haskell.org/Unix_tools/Date let todays_date = formatCalendarTime defaultTimeLocale "%Y-%m-%d" time (command:argList) <- getArgs when ((command == "today" && Data.List.null argList) || (command `elem` ["new", "crossoff", "putoff", "delete"] && length argList == 1) || (command == "moveto" && length argList == 2)) $ do username <- fmap fst readnetrc password <- fmap snd readnetrc token <- login [username, password] dispatch command (token, todays_date:argList) readnetrc = do home <- getHomeDirectory netrc <- lines Control.Applicative.<$> readFile (home ++ "/.netrc") let netrc' = dropWhile (not . isInfixOf "teuxdeux") netrc let (username, password) = if "login" `isInfixOf` head netrc' -- if entry is on one line then (getcred "login", getcred "password") -- if entry is on multiple lines else (last $ words $ netrc' !! 1, last $ words $ netrc' !! 2) where getcred c = dropWhile (not . isInfixOf c) (words $ head netrc') !! 1 |
| ︙ | ︙ | |||
69 70 71 72 73 74 75 | curlpost (token, [todays_date, key, value, apiurl, okresponse]) number = do let curlheader = "X-CSRF-Token: " ++ token --Can be much improved, but will do for now: json <- if isJust number then do tdsf <- curlget (token, todays_date) let itemid = Main.id $ tdsf!!(read (fromJust number)::Int) | | | | | | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
curlpost (token, [todays_date, key, value, apiurl, okresponse]) number = do
let curlheader = "X-CSRF-Token: " ++ token
--Can be much improved, but will do for now:
json <- if isJust number
then do
tdsf <- curlget (token, todays_date)
let itemid = Main.id $ tdsf!!(read (fromJust number)::Int)
let modjson = "{ \"ids\" : [\""++show itemid++"\"], \""++key++"\" : \""++value++"\"}"
return modjson
else do
--Can just straight return these strings, need to let them first
let newjson = "{ \"current_date\" : \""++todays_date++"\", \""++key++"\" : \""++value++"\"}"
return newjson
body <- readProcess "curl" ["-s", "-XPOST", apiurl, "-L", "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader, "-H", "Content-Type: application/json", "-d", json] []
--just check body contains stuff?
--putStrLn body
if "done_updated_at" `isInfixOf` body
then putStrLn okresponse
else putStrLn "Uh Oh! Didn't work!"
curldelete (token, [todays_date, apiurl, okresponse]) number = do
tdsf <- curlget (token, todays_date)
let itemid = Main.id $ tdsf!!(read number::Int)
let curlheader = "X-CSRF-Token: " ++ token
body <- readProcess "curl" ["-s", "-XDELETE", apiurl++show itemid, "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader] []
--putStrLn okresponse
return()
-- what does the response say?
-- if respCurlCode resp == CurlOK && respStatus resp == 200
-- then putStrLn okresponse
-- else putStrLn "Uh Oh! Didn't work!"
curlput (token, [todays_date, json, apiurl, okresponse]) number = do
--Need the json we are PUTTING somewhere in here
tdsf <- curlget (token, todays_date)
--Need some way to post the body.
--Need headers for posting json "Content-Type: application/json"
-- -d ""
let itemid = Main.id $ tdsf!!(read number::Int)
--let curlpostfields = return $ CurlPostFields [json] --try json here
let curlheader = "X-CSRF-Token: " ++ token
body <- readProcess "curl" ["-s", "-XPUT", apiurl++show itemid, "-L", "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader, "-H", "Content-Type: application/json", "-d", json] []
--how to check response? For now that will make parsing hard so let it fail
--just check body contains stuff?
if "done_updated_at" `isInfixOf` body
then putStrLn okresponse
else putStrLn "Uh Oh! Didn't work!"
getauthtoken body = do
let bodylines = lines body
let authline = dropWhile (not . isInfixOf "authenticity_token") bodylines
let authwords = words $ head authline
|
| ︙ | ︙ | |||
130 131 132 133 134 135 136 | login [username, password] = do --See if we have a token, then to clear we can just delete the file home <- getHomeDirectory --handle error check <- doesFileExist (home ++ "/.haskerdeux-token") if check | | | < | 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | login [username, password] = do --See if we have a token, then to clear we can just delete the file home <- getHomeDirectory --handle error check <- doesFileExist (home ++ "/.haskerdeux-token") if check then readFile (home ++ "/.haskerdeux-token") else do body <- readProcess "curl" ["-s", "-L", "-c", "haskerdeux.cookies", "https://teuxdeux.com/login"] [] token <- getauthtoken body writeFile (home ++ "/.haskerdeux-token") token --can probably use one post? let curlheader = "X-CSRF-Token: " ++ token let curlpostfields = "username=" ++ username ++ "&password=" ++ password ++ "&authenticity_token=" ++ token |
| ︙ | ︙ | |||
164 165 166 167 168 169 170 | putoff (token, [todays_date, number]) = do let tomorrows_date = show (addDays 1 $ read todays_date::Data.Time.Day) curlpost (token, [todays_date, "current_date", tomorrows_date, "https://teuxdeux.com/api/v1/todos/reposition/", "Put Off!"]) (Just number) | | | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | putoff (token, [todays_date, number]) = do let tomorrows_date = show (addDays 1 $ read todays_date::Data.Time.Day) curlpost (token, [todays_date, "current_date", tomorrows_date, "https://teuxdeux.com/api/v1/todos/reposition/", "Put Off!"]) (Just number) moveto (token, [todays_date, number, new_date]) = --TODO: Need to figure out moving to bottom of a list curlpost (token, [todays_date, "current_date", new_date, "https://teuxdeux.com/api/v1/todos/reposition", "Moved!"]) (Just number) remove (token, [todays_date, number]) = curldelete (token, [todays_date, "https://teuxdeux.com/api/v1/todos/", "Deleted!"]) number |
| ︙ | ︙ |