安防 光速东莞网站建设,百度推广平台登录,深圳网站开发antnw,区块链开发技术的应用Things3[1] 是一款苹果生态内的任务管理软件#xff0c;是一家德国公司做的#xff0c;非常好用。我前后尝试了众多任务管理软件#xff0c;最终选定 things3#xff0c;以后有机会会写文章介绍我是如何用 things3 来管理我的日常任务。本文主要介绍欧神写的 tli[2] 工具来…Things3[1] 是一款苹果生态内的任务管理软件是一家德国公司做的非常好用。我前后尝试了众多任务管理软件最终选定 things3以后有机会会写文章介绍我是如何用 things3 来管理我的日常任务。本文主要介绍欧神写的 tli[2] 工具来学习如何写一个定制的通过邮件和 things3 沟通的工具。很多软件都有类似的邮件功能例如给绑定的 kindle 邮件地址发送电子书文件就可以在 kindle 设备上看到。学会写工具的套路后今后就能自己写类似的工具了。使用场景正常情况下我们可以在 mac/ipad/iphone 上可以通过软件界面添加 TODO 事项而且 things3 本身也有全局快捷录入的功能非常方便。但是 things3 只能在苹果生态内使用当我们临时切换到 windows 或者 linux 上工作就不好操作了。这时如果产生了新的 TODO通过 tli打开 terminal 工具就能将 TODO 加到 inbox 里。命令行操作同步到 things3初始化配置因为要通过邮件来和 things3 沟通因此需要配置发送邮件的邮箱、SMTP 服务器、用户名、密码、things3 给我们的专属邮件地址。由于通过 tli 发送 TODO 是一次性的任务因此这些配置项需要保存在某个文件中之后用到的时候直接读取就好了。具体的配置项包括type tliConf struct {SMTPHost string yaml:smtp_hostSMTPPort string yaml:smtp_portAvatar string yaml:avatarEmailAddr string yaml:email_addrUsername string yaml:usernamePassword string yaml:passwordThingsAddr string yaml:things_addr
}我用的 gmail 作为发送邮件配置的 SMTP 参数是smtp.gmail.com:587。EmailAddr 就是 gmail 地址Password 需要设置一个专用的。使用 user.Current() 方法可以拿到当前用户的信息包括 home directory用户名等等。tli 将配置文件保存到 home 目录下。使用 bufio 包在 terminal 里读取用户的输入s : bufio.NewScanner(os.Stdin)
log.Printf(SMTP Host Address: )
if !s.Scan() {log.Println(init was canceled.)return
}
info : s.Text()
tli.SMTPHost info将配置序列化成 yaml 后写入 ~/.tli_config。func (c *tliConf) save() {checkhome()data, err : yaml.Marshal(c)if err ! nil {log.Fatalf(cannot save your data, err: %v, err)}f, err : os.OpenFile(homedir/pathConf,os.O_CREATE|os.O_RDWR, 0600)if err ! nil {return}defer f.Close()all : []byte(---\n)all append(all, data...)if _, err : f.Write(all); err ! nil {return}
}读取 title 和 body用户执行 todo 命令时可输入 title 和 body。且 body 支持多行输入输入空行或者按 ctrlC 时取消输入。TODO title 通过命令行直接传入body 则通过一个 for 循环等待用户输入func (a *tliTODO) waitBody() bool {s : bufio.NewScanner(os.Stdin)fmt.Println((Enter an empty line to complete; CtrlC/CtrlD to cancel))sigCh : make(chan os.Signal, 1)signal.Notify(sigCh, os.Interrupt)line : make(chan string, 1)go func() {for {fmt.Print( )if !s.Scan() {sigCh - os.Interruptreturn}l : s.Text()if len(l) 0 {line - return}line - l}}()for {select {case -sigCh:return falsecase l : -line:if len(l) 0 {return true}a.body append(a.body, l)}}
}并且监听了取消息信号异步启动一个协程去监听输入再在 for select 中监听 sigCh若用户手动取消了则返回 false。若用户输入了空行则返回 true代表输入完成之后就可以发送邮件。发送邮件因为 things3 有 2000 字的限制所以需要做一个分割防止被截断。func (a *tliTODO) Range(f func(string, string)) {whole : strings.Join(a.body, \n)if len(whole) maxlen {f(a.title, whole)return}count : 1for i : 0; i len(whole); i maxlen {f(a.titlefmt.Sprintf( (%d), count), whole[i:min(imaxlen, len(whole))])count}
}调了 smtp.SendMail 方法发送邮件。注意需要对中文字符做一个编码否则 things3 里会出现乱码。TODO 历史每次执行 todo 命令时都会保存到历史中同样是用 yaml 序列化。之后执行 log 命令时可将其读出来展示历史。每条记录前加一个”---“用于分离读的时候就可以读出多条记录rs : []record{}
for {var r recorderr d.Decode(r)if err ! nil {if err io.EOF {break}log.Fatalf(corrupted ~/.tli_history file, err: %v, err)}rs append(rs, r)
}cobra 命令行这是一个比较常用的库了用于写命令行工具。定义 init, log, todo 三个 command再定义一个 root command说明用法。总结总体来说这个项目比较简单不到 500 行但也能学到不少写工具软件的技巧之后写类似的工具时可以参考。使用 cobra 创建不同的命令。将配置文件保存到用户 home 目录下。如何从控制台接收用户的输入文本。使用 smtp.SendMail 发送邮件。参考资料[1]Things3: https://culturedcode.com/things/[2]tli: https://github.com/changkun/tli