sine.alarmclock 1.0.6
Windows command line alarm clock (python3)
License: MIT
Requires Python: >=3.6.0

# 闹钟

* Python制作的windows命令行闹钟，指令简单，带倒计时模式，可精确到秒。
* 可设置一次性闹钟、按星期重复的闹钟、按掉后一段时间（周期）再响的闹钟。
* 可自定义beep音频或使用本地铃声。
* 任务栏闪烁提醒、系统消息提醒（以下均得到pypiwin32模块支持）。
* 托盘图标：提供闪烁提醒、左键隐藏窗口、右键菜单、悬浮显示状态文字。

*v0.7.1开始放弃兼容 python2 ，改为 python3.6+*
*建议从PyPI安装*

## 从PyPI安装

`pip install sine.alarmclock`

## 运行

选择一个工作目录，命令行执行：

`python -m sine.alarmclock`

该工作目录用于：

* 保存闹钟数据
* 保存用户配置  
* 放置本地铃声（方便引用）

## 常用指令简介（v0.4-）

假设当前时间5月8日17:10

    添加一次性闹钟（可追加提示信息）：
    18:         18:00
    18:30       18:30
    30          17:30
    -10         17:20 （10分钟后）
    -1:         18:10 （1小时后）
    /10 12:     5月10号12:00

    闹钟响后：
    Enter       暂停闹钟，延迟响
    a           取消闹钟，不再响
    s           关闭闹钟

    w1 -10      把第一个闹钟改为10分钟后

## 概念定义（v0.5-）

一次性闹钟
: 用完自动删除。

星期重复闹钟
: 一般意义上的闹钟。比如设置工作日响，也可不重复，表示只响一次（每天有效），之后自动关闭。

周期重复闹钟
: 每次取消之后间隔一定时间后再响。和整点报时不同，是从取消之后计算。（本人用于提醒部分有冷却时间的游戏活动）

取消闹钟（cancel）
: “按掉”，表示完成任务或忽略。

提醒闹钟（remind）
: 正在（响铃）提醒的闹钟。

到期闹钟（expired）
: 提醒过的闹钟。

## 全部指令（v0.7-）

分为三个页面

### 主页面（闹钟列表）

    q ---- 退出

    添加闹钟：
    [<date>] <time> [<msg>]              ---- 一次性闹钟
    [<date>] <time> w <weekdays> [<msg>] ---- 按星期重复
    [<date>] <time> r <period> [<msg>]   ---- 按周期重复

    修改：
    e<index>                 ---- 进入编辑页面
    w<index> [<date>] <time> ---- 修改时间
    a[<index>]               ---- 取消闹钟。默认取消第一个到期闹钟。
    s[<index> ...]           ---- 切换开关。默认关闭第一个到期闹钟或第一个闹钟。
    r<index> ...             ---- 删除闹钟

    d     ---- 切换静音
    Enter ---- 延迟提醒，{提醒间隔}之后再响（对所有到期闹钟）

### 编辑页面

    w[<date>] <time>       ---- 修改时间
    a<seconds>             ---- 提前若干秒提醒
    m<msg>                 ---- 修改信息
    r[<weekdays>|<period>] ---- 修改重复时间（闹钟种类不能更改）
    s[<wav_file>]          ---- 设置本地铃声，使用相对或绝对路径，可省略后缀。
                                此外，'default'表示播放beep音频；空表示无铃声；
                                还可用win32的几个注册表声音（见配置文件）。

### 响铃页面（屏幕闪烁时）

    Enter ---- 延迟提醒，{提醒间隔}之后再响（对所有提醒闹钟）
    a     ---- 取消第一个提醒闹钟。
    s     ---- 关掉第一个提醒闹钟。

## 指令参数格式（v0.4-）

### 日期和时间（date/time）

    默认时间格式：其中H小时，M分钟，S秒  
    M  
    H:  
    :S  
    H:M  
    :M:S  
    H:M:S  

    默认日期格式：其中y两位年份，m月份，d日  
    /d  
    m/d  
    y/m/d  

时间前面加上'-'为倒计时模式，比如'-10'为10分钟之后。  

### 周期（period）

同'时间'格式，不能超过24小时。  

### 星期（weekdays）

* 星期一到日分别对应 1234567
* 数字并列，可乱序
* 只输入"0"等其他字符表示不重复

比如"12345", "13756", "0"

### 其他

'...'表示可输入多个值（空格分离）。

## 其他特性

* 列表中显示的时间为闹钟下一次生效的时间，类似于日程或事件。
* 列表在非当天的闹钟之前添加一个空行，突出今天的闹钟（任务或事件）。
* **可取消未到期的闹钟**：
  * 对星期重复闹钟，可取消下一次提醒。  
  例如当前星期日，闹钟在工作日，取消一次则星期一不会响铃，时间相应推迟到星期二，以此类推。  
  特别地，对不重复的闹钟，关闭。
  （通过重新开启闹钟重置。）
  * 对周期重复闹钟，从当前时间重新开始计时。（类似于响铃后取消。）
  * 对一次性闹钟，相当于关闭。
* 星期重复闹钟，类似一般意义上的闹钟，会在程序重新启动（包括电脑唤醒后）刷新。  
表现类似于手机闹钟，关机后到时的闹钟不会在开机后补充响铃。
* 添加闹钟时，如果闹钟时间已过，则自动推迟设置为明天（对于星期重复闹钟则是下一个有效日）。

## 配置

### 一般配置

clock.conf，里面有说明。

### 日期时间格式

date.conf，time.conf中配置识别格式（按顺序尝试识别）。  
文件内容为键值对：

* key：识别读取数据的格式；  
* value：要替换的字段。主要针对闹钟时间的设置（正常模式），对未输入字段置0。  

原理说明：比如 `%M=minute,second,microsecond` 只读取一个数字（分钟），  
替换掉当前时间的分、秒、微秒，这就保留了当前时间的日期和小时，  
而没有读到的秒和微秒，相当于置0，最终设置为当前小时的这个分钟。  

### beep音频配置

beep.conf配置调用winsound.Beep的时序。  
每行有2种格式：

* 只有1个数字代表延迟（毫秒）。  
* 逗号分隔的2个数字代表声音频率和时长（毫秒）。  
这段音频将会循环播放。  

*配置只在启动时读取，要生效必须重新启动。*

### 托盘图标

使用ico后缀格式的图片文件：
正常状态clock.ico
静音状态quiet.ico
提醒状态alarm.ico
消息提示msg.ico(另外显示的图标)
需要自定义时替换相应文件即可。

## 更新日志

### v1.0.6, 2019-12-14

* 托盘图标支持在资源管理器重启后重新显示

### v1.0.5, 2019-8-10

* 修复托盘悬浮显示已关闭的闹钟。

### v1.0.4, 2019-8-6

* 增加日志配置。
* 修复代码（不影响使用）

### v1.0.3, 2019-7-31

* 修复代码（不影响使用）

### v1.0.2, 2019-7-31

* 修复唤醒时没有更新星期重复闹钟。

### v1.0.1, 2019-7-26

* 修复托盘的闹钟排序偶尔不正常。

### v1.0.0, 2019-7-21

* 增加数据保存的可靠性，更改了数据存储方式。
* 依赖包整理。
* 放弃 python2 兼容。
* 增加配置: encoding, debug.no_clear_screen

### v0.7.3, 2019-4-17

* 修复：托盘提示信息可能更新不及时

### v0.7.2, 2019-3-15

* 修复：全屏时右键菜单可能打不开。

### v0.7.1, 2019-2-9

* 转为在 python3.6+ 下运行。
* 增加了 pypiwin32 依赖，无需再安装 win32api, win32gui 。

### v0.7.0, 2018-10-22

* 全部汉化，配置文件支持中文字符。
* 增加windows系统消息提示的弹出（右下角，只在首次响铃时，可关闭）。
* 左键点击托盘切换到窗口，再次点击才隐藏。
* 托盘右键菜单可静音、关闭消息提示。
* 托盘右键菜单可提前取消今日闹钟。
* 托盘悬浮文字显示静音等状态。
* *窗口和悬浮文字显示标题为：闹钟 v版本号。*
* * 新增日志记录，可通过配置 debug 开启。 *
* *主页面增加静音的指令 'd' 。*
* *闹钟列表更明显分隔开今日闹钟、已关闭的闹钟。*
* *强化前置窗口、前置托盘右键菜单。*
* *托盘悬浮文字在响铃时有所强调。*
* *托盘悬浮文字增加最大长度的限制（默认24），并取消引号。*
* *在睡眠唤醒和跨天时更新托盘悬浮文字。*
* *增加闹钟读取异常时对文件的备份。*
* *声音 和 消息提示 的状态也显示在屏幕上。*
* *新增 msg.ico 为弹窗提示的图标。*
* *更新托盘图标，放大了一些，更新静音的样式。*
* *铃声改为播放最后（时间最晚）的闹钟。*
* *新建重复闹钟指令中，'w' 和 'r' 后不再需要空格。*
* *更新时间识别格式的默认值。*
* *修改beep最大持续时间为2秒。*

### v0.6.3, 2018-9-21

* 修复有到期闹钟时无法隐藏/显示窗口的问题。

### v0.6.2, 2018-9-19

* 响铃时左键点击托盘即可停止响铃，延迟提醒。
* *修正托盘菜单文字*

### v0.6.1, 2018-9-15

* 托盘右键可以取消到期闹钟。
* 增加不支持托盘时的处理。
* 修复启动时悬浮不显示闹钟的问题。

### v0.6.0, 2018-9-12

* **增加托盘图标的显示与功能:**
* 单击图标隐藏/显示窗口。
* 图标右键菜单：延迟提醒、静音、退出。
* 有到期闹钟时图标闪烁。
* 悬停显示到期闹钟或当日闹钟。

### v0.5.7, 2018-8-13

* 修改时间时也会将以过时间推迟到明天。

### v0.5.6, 2018-7-30

* 修复添加星期闹钟时会在当天响的问题。
* *凌晨刷新列表。*

### v0.5.5, 2018-6-7

* **更改配置文件格式为properties**（使用新的properties库读取）。  
    更新了时间格式文件（time）配置，  
    为了适配properties格式对冒号进行了转义，  
    另外可用小数点代替冒号。  
* 指令接受大写字母
* 修复v0.5.2以来项目没有上传默认配置文件到PyPI。
* 优化任务栏闪烁，同时闪烁窗口。（flashWindow库更新）

### v0.5.4, 2018-6-4

修复5.0版本后开启时没有重排序的问题。  

### v0.5.3, 2018-6-4

主列表的空行也会间隔开已关闭的闹钟了。  

### v0.5.2, 2018-5-23

项目管理调整：项目改成独立库，发布到PyPI。  
从github的个人python仓库独立出来作为一个项目，以PyPI库的格式管理，同时将几个依赖移至PyPI，以便通过pip安装。  

### v0.5.1, 2018-5-20

修复响铃自动停止时的异常问题。  

### v0.5.0, 2018-5-18

程序改由根目录以模块运行。  
重新定义一次性闹钟，用完自动删除；原本的一次性闹钟改为星期重复闹钟，只是重复星期为空。  
可以自定义beep音频。  
配置中布尔变量可以用0设置（原本只能用False）。  
修改了数据存储格式，提供了转换脚本。  
闹钟列表中对非今天的闹钟以空行分隔。  
电脑睡眠/待机（5分钟以上）唤醒后自动更新星期重复闹钟。  
为了更新不影响配置，代码版本控制中，配置文件重新定义为默认配置文件，在无配置文件时将被复制。  
修复部分异常警告没有生效。  
修复配置读取异常时默认配置不生效。  
修复不支持任务栏闪烁时导致的问题。  
修复铃声文件不存在时的问题，会播放beep。  
修复把目录视为文件判断为文件存在所导致的问题。  
修复周期重复闹钟创建时的周期可为0。  
修复提前提醒时间可为负。  

### v0.4.0, 2018-1-20

简化命令格式。  
增加可编辑内容。  
增加提前提醒功能。  
可配置日期时间识别格式，还有其他配置。  
更新数据文件版本为3。  
列表增加“重复”的显示。  
音频文件支持绝对或相对路径，并在启动程序或修改时检查存在性。  

### v0.3.5, 2018-1-18

增加配置：默认铃声（新增闹钟时）。使用'default'表示默认beep铃声。  
同时，支持不响铃（设置为空）。  

### v0.3.4, 2018-1-12

部分配置从文件clock.conf读取，详细说明见配置文件。  

### v0.3.3

增加闹铃时任务栏闪烁的提醒  
修正添加星期重复闹钟时没有进行过时判断  

### v0.3.2

修复添加星期重复时没有指定星期导致出错的问题。  
修改时间时会对一次性和星期重复进行过时处理。  

### v0.3.1

一次性闹钟不会设置为过去时间了（比如当天过期则自动设置为明天）  
过期一次性闹钟的开启改为“下一天”的时间  
修复修改信息的问题（原本只会取信息第一个空格之前的内容）  
补上编辑界面的指令错误提示  

### v0.3.0

增加自定义铃声的功能，要求wav格式放在根目录下  
增加编辑页面，可供修改信息和铃声  
调整页面信息的展示顺序  
修复关闭普通闹钟后没有重新排序  

### v0.2.4

优化later：有提醒闹钟时延迟所有提醒闹钟，没有时延迟所有到期闹钟  
修正cancel，对关闭的闹钟无效  
优化switch：只在开启且过期才重置时间  
优化闹钟排序方式：关闭的闹钟在最后（会按被关闭顺序）  
更正expired为remind；对cancel和switch使用同样的选择方式：第一个提醒或过期  
修正cf指令说明  
说明中增加了概念解释  

### v0.2.3

修复闹铃自动结束不刷新界面（显示闹钟列表）的问题  
修正回车说明  
修复延迟提醒的逻辑错误  
switch默认关闭首个到期闹钟  
设置时间后自动开启闹钟  
优化按键  
取消remove的默认值  

### v0.2.2

修复错误指令的输出  
增加修改时间  
分离出2种时间输入方式：直接和倒计时，给所有输入情况  

### v0.2.1

修复暂停没有保存，启动30秒后不响的问题  

### v0.2

增加2种重复闹钟：星期、周期  
增加闹钟的开关和停止操作  
增加输入错误的反馈  
响铃时间30秒  

### v0.1.1

增加修改信息  
修复删除输入不对时的重复反馈  

### v0.1

可添加指定(日期)时间的闹钟、倒计时闹钟，可附带信息；  
到时间后，屏幕闪烁到期的闹钟，并有报警声；  
手动暂停后，在闹钟列表中有!!!标识，5分钟后会再响  
真正的关掉必须通过序号删除闹钟  

倒计时只是输入形式，并不显示为倒计时