# Haskerdeux - A Simple Command Line Client for Teuxdeux in Haskell
Written with the dual purpose of being a learning exercise for Haskell and also because I really wanted a command line tool for [Teuxdeux](http://teuxdeux.com). As it stands this is a bit rough and ready, but it does work.
It used to use Network.Curl, but I can't get that to work anymore so I'm doing straight system calls to curl which means it's not very Haskelly and ultimately a bit of a pointless use of Haskell, but it's for me, so there.
## Status
Alive! Official status is "Messy and works for me, unlikely to improve"; It was dead for years because I didn't think it was possible to get the new API to work.
## Requirements
You need the following Haskell packages installed:
- Data.List.Split
- Text.JSON
I also suggest you compile it to use it - it's much faster to use that way. Just do `ghc --make haskerdeux.hs`. If you don't compile it then replace `./haskerdeux` in the examples below with `runhaskell haskerdeux.hs`.
## Features/Commands
Haskerdeux works in the following way:
`haskerdeux <date> <command> <optional args>`
I.e. the date supplied is the date the commands act on. It understands "today", "tomorrow" and dates in "YYYY-MM-DD" format. All commands recognise and require a date.
It includes the following commands:
### Todos
For listing todos only (as that is all I want to see)
`haskerdeux today todos`
`haskerdeux tomorrow todos`
`haskerdeux 2017-02-28 todos`
This returns a numbered list, like so:
0 - Write README for Haskerdeux
1 - Write Blog post about Haskerdeux
2 - Split development work in different branch
3 - Perhaps do some actual work you are paid to do
You can use those numbers with the PutOff and CrossOff commands, etc.
### New
For creating new tasks
`haskerdeux today new "<A todo item for today>"`
`haskerdeux tomorrow new "<A todo item for tomorrow>"`
### PutOff
For putting off a task until the next day.
`haskerdeux today putoff <tasknumber from todos list>`
E.g:
`haskerdeux today putoff 3`
### MoveTo
For moving a task to another date.
`haskerdeux today moveto <tasknumber from todos list> <date in YYYY:MM:DD>`
E.g:
`haskerdeux today moveto 11 2012-09-01`
### CrossOff
For marking a task as complete
`haskerdeux today crossoff <tasknumber from todos list>`
### Delete
For completely removing a task
`haskerdeux today delete <tasknumber from todos list>`
## Using .netrc For Storing Username and Password
It's compulsory. It used to support passing username/password as command line args, but no more. The `<username>` and `<password>` are read from `.netrc`. Just add an entry to `.netrc` as follows:
machine teuxdeux.com
login superprocrastinator
password mysecretpassword
Or the single line format:
machine teuxdeux.com loging superprocrastinator password mysecretpassword
It should work ok with either format. It won't work if you have spaces in your password though.
## Development
Nope.
## Thanks
Some resources that helped me figure this out:
- [A Haskell Newbies Guide to Text.JSON](http://www.amateurtopologist.com/blog/2010/11/05/a-haskell-newbies-guide-to-text-json/) and especially the comments explaining the generic approach.
- For the new API and making me realise it was possible to make this work once again, [dmi3's TeuxDeux Unofficial API for Python](https://github.com/dmi3/teuxdeux).