• R/O
  • SSH
  • HTTPS

dietmemorer: Commit


Commit MetaInfo

Revision20 (tree)
Time2008-01-23 14:17:09
Authoryaggy

Log Message

体重・体脂肪グラフ機能
リセット機能をとりあえず付けてみた。

Change Summary

Incremental Difference

--- trunk/src/mail/dmr_graph.txt (nonexistent)
+++ trunk/src/mail/dmr_graph.txt (revision 20)
@@ -0,0 +1,3 @@
1+[痩]М〆(._. グラフ
2+グラフ描いたよ!
3+↓から見てね。
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
--- trunk/src/mail/dmr_reset.txt (nonexistent)
+++ trunk/src/mail/dmr_reset.txt (revision 20)
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
--- trunk/src/mail/dmr_help.txt (revision 19)
+++ trunk/src/mail/dmr_help.txt (revision 20)
@@ -1,4 +1,26 @@
11 [痩]使い方
2-じゅんびちゅー
3- 〜(_C・>
4-でやんす。
2+こんにちは!
3+ダイエットメモらーです。(DM)
4+
5+食べたものとエネルギー(kcal)を送ってくれると、どんどんメモしていくよ。
6+エネルギー(kcal)がわからない場合には、いままで同じものを食べた人がいれば、その食べ物の平均値で計算しちゃうよ。
7+運動した場合は、マイナスのエネルギーを書くといいかもね。
8+
9+体重と体脂肪は特別で、
10+体重 73.82
11+体脂肪 28.21
12+みたいに書くと、その日の体重・体脂肪を記録していくよ。
13+
14+タイトルに、
15+グラフ
16+って書いて送ってくれると、最大過去90日の体重・体脂肪のグラフが見られるよ。
17+体重だけ、体脂肪だけのグラフを見たい場合は、
18+体重グラフ
19+体脂肪グラフ
20+って書いて送ってね。
21+
22+間違えちゃった場合はタイトルに、
23+リセット
24+って書いて送ると、その日に食べたものを一切忘れるよ。
25+
26+じゃあ、ぼくと一緒にがんばってダイエットしようね!
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
--- trunk/src/mail/dmr_graph_err.txt (nonexistent)
+++ trunk/src/mail/dmr_graph_err.txt (revision 20)
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
--- trunk/src/mail/dmr_footer.txt (revision 19)
+++ trunk/src/mail/dmr_footer.txt (revision 20)
@@ -1,3 +1,3 @@
1-
2-ダイエットメモらー 0.0
1+---
2+ダイエットメモらー 0.1
33 kcal@dietmemo.net
--- trunk/src/graph_creator.rb (nonexistent)
+++ trunk/src/graph_creator.rb (revision 20)
@@ -0,0 +1,159 @@
1+require 'dmem_debug.rb'
2+require 'mysql_connect.rb'
3+require 'rubygems'
4+require 'gruff'
5+require 'digest/sha1'
6+
7+class GraphCreator
8+
9+ # コンストラクタ
10+ # _dbh_ :: mysqlへのデータベースハンドル
11+ def initialize(dbh)
12+ @dbh = dbh
13+ end
14+
15+ @@ModeGraphWeight = 1
16+ @@ModeGraphFat = 2
17+ @@ModeGraphWF = 3
18+
19+ # 体重グラフ作成
20+ def createwgraph(basepath, email)
21+ return creategraph(basepath, email, @@ModeGraphWeight)
22+ end
23+
24+ # 体脂肪グラフ作成
25+ def createfgraph(basepath, email)
26+ return creategraph(basepath, email, @@ModeGraphFat)
27+ end
28+
29+ # 体重・体脂肪グラフ作成
30+ def createwfgraph(basepath, email)
31+ return creategraph(basepath, email, @@ModeGraphWF)
32+ end
33+
34+ # グラフ作成ベース
35+ def creategraph(basepath, email, mode)
36+
37+ seed = email
38+ seed += Time.now.to_s
39+ filename = Digest::SHA1.hexdigest(seed) + ".jpg"
40+ pathname = basepath + filename
41+
42+ hweight = Hash.new
43+ hfat = Hash.new
44+
45+ nowday = Date.today
46+
47+ # 体重
48+ tsth = @dbh.prepare("SELECT weight, adddate FROM dweight WHERE mailadd = ? AND adddate > DATE_ADD(CURDATE(), INTERVAL -90 DAY)")
49+ tsth.execute(email)
50+ if 0 != tsth.rows then
51+ tsth.fetch do |weight|
52+ hweight[weight[1].to_s] = weight[0]
53+ end
54+ end
55+ tsth.finish
56+
57+ # 体脂肪
58+ tsth = @dbh.prepare("SELECT fat, adddate FROM dfat WHERE mailadd = ? AND adddate > DATE_ADD(CURDATE(), INTERVAL -90 DAY)")
59+ tsth.execute(email)
60+ if 0 != tsth.rows then
61+ tsth.fetch do |fat|
62+ hfat[fat[1].to_s] = fat[0]
63+ end
64+ end
65+ tsth.finish
66+
67+ maxbef = 91
68+
69+ i = maxbef
70+ started = false
71+ cnt = 0
72+ befweight = 20.0
73+ beffat = 20.0
74+
75+ aweight = []
76+ afat = []
77+
78+ while i >= 0
79+
80+ day = (nowday - i).to_s
81+
82+ if false == started then
83+ if @@ModeGraphWeight == mode then
84+ if nil != hweight[day] then
85+ started = true
86+ end
87+ elsif @@ModeGraphFat == mode then
88+ if nil != hfat[day] then
89+ started = true
90+ end
91+ elsif @@ModeGraphWF == mode then
92+ if nil != hweight[day] and nil != hfat[day] then
93+ started = true
94+ end
95+ end
96+ end
97+
98+
99+ if started then
100+ if nil != hweight[day] then
101+ befweight = hweight[day]
102+ end
103+ if nil != hfat[day] then
104+ beffat = hfat[day]
105+ end
106+
107+ aweight.push(befweight)
108+ afat.push(beffat)
109+
110+ cnt += 1
111+ end
112+
113+ i -= 1
114+
115+ end
116+
117+ if 0 == cnt then
118+ return ""
119+ end
120+
121+ g = Gruff::Line.new 400
122+
123+ g.font = "/usr/local/grass5/fonts/ipagp.ttf"
124+ g.theme_37signals
125+
126+ if @@ModeGraphWeight == mode then
127+ g.title = "メモらーグラフ 体重"
128+ g.data("体重", aweight)
129+ elsif @@ModeGraphFat == mode then
130+ g.title = "メモらーグラフ 体脂肪"
131+ g.data("体脂肪率", afat)
132+ elsif @@ModeGraphWF == mode then
133+ g.title = "メモらーグラフ"
134+ g.data("体重", aweight)
135+ g.data("体脂肪率", afat)
136+ end
137+
138+ hindex = Hash.new
139+ hindex[0] = (nowday - cnt + 1).to_s
140+ hindex[(cnt * 1 / 4)] = (nowday - (cnt * 3 / 4)).to_s
141+ hindex[(cnt * 2 / 4)] = (nowday - (cnt * 2 / 4)).to_s
142+ hindex[(cnt * 3 / 4)] = (nowday - (cnt * 1 / 4)).to_s
143+ hindex[cnt - 1] = (nowday).to_s
144+
145+ g.labels = hindex
146+
147+ tmpg = "/tmp/dmgraph.png"
148+ g.write(tmpg)
149+
150+ # 画像の回転
151+ img = Magick::ImageList.new(tmpg)
152+ rotate = img.rotate(90)
153+ rotate.write(pathname)
154+
155+ return filename
156+ end
157+
158+end
159+
--- trunk/src/mail_analizer.rb (revision 19)
+++ trunk/src/mail_analizer.rb (revision 20)
@@ -27,42 +27,64 @@
2727 @@sub_lastmonth = "先月"
2828 # 先月の詳細合計機能のキーワード
2929 @@sub_lastmonth = "詳細先月"
30- # アンドゥ機能のキーワード
31- @@sub_undo = "まちがい"
3230
3331 # ヘルプのキーワード
3432 @@sub_help = ["ヘルプ", "へるぷ", "使い方", "つかいかた"]
3533
36- # 体重遷移機能のキーワード
37- @@sub_weight = ["やせた?", "やせた?", "やせた"]
34+ # グラフのキーワード
35+ @@sub_graph = ["やせた?", "やせた?", "やせた", "グラフ", "ぐらふ", "クラブ", "くらぶ"]
3836
37+ # 体重グラフのキーワード
38+ @@sub_wgraph = ["体重グラフ", "体重ぐらふ", "たいじゅうぐらふ", "体重クラブ", "体重くらぶ", "たいじゅうくらぶ"]
39+
40+ # 体脂肪グラフのキーワード
41+ @@sub_fgraph = ["体脂肪グラフ", "体脂肪ぐらふ", "たいしぼうぐらふ", "体脂肪クラブ", "体脂肪くらぶ", "たいしぼうくらぶ"]
42+
43+ # 当日リセットのキーワード
44+ @@sub_reset = ["リセット", "りせっと", "まちがい"]
45+
3946 # 体重記録のキーワード
4047 @@body_weight = ["体重", "たいじゅう", "おもさ"]
4148
4249 # 体脂肪記録のキーワード
43- @@body_fat = ["体脂肪", "脂肪", "たいしぼう"]
50+ @@body_fat = ["体脂肪", "脂肪", "たいしぼう", "しぼう"]
4451
4552 # 一日最大エネルギーのキーワード
4653 @@body_limit = "最大"
4754
4855 # 登録時メール返信文
49- @@repmail_first="mail/dmr_first.txt"
56+ @@repmail_first = "mail/dmr_first.txt"
5057
5158 # フッタ文
52- @@repmail_footer="mail/dmr_footer.txt"
59+ @@repmail_footer = "mail/dmr_footer.txt"
5360
5461 # メモ時メール返信文
55- @@repmail_memo="mail/dmr_memo.txt"
62+ @@repmail_memo = "mail/dmr_memo.txt"
5663
5764 # ヘルプメール返信文
58- @@repmail_help="mail/dmr_help.txt"
65+ @@repmail_help = "mail/dmr_help.txt"
5966
67+ # グラフ返信文
68+ @@repmail_graph = "mail/dmr_graph.txt"
69+
70+ # グラフエラー時返信文
71+ @@repmail_graph_err = "mail/dmr_graph_err.txt"
72+
73+ # リセット返信文
74+ @@repmail_graph = "mail/dmr_reset.txt"
75+
6076 # 曜日配列
6177 @@wdays = ["日", "月", "火", "水", "木", "金", "土"]
6278
79+ # グラフ出力ディレクトリ
80+ @@graph_dir = "/usr/local/apache2/htdocs/ext/graph/"
81+
82+ # グラフ表示用URL
83+ @@graph_url = "http://dietmemo.net/ext/graph/"
84+
6385 # コンストラクタ
6486 # _dbh_ :: mysqlへのデータベースハンドル
65- def initialize(dbh)
87+ def initialize(dbh, graphpath)
6688 @dbh = dbh
6789 end
6890
@@ -143,6 +165,80 @@
143165 MailControl.sendmail(smtpserver, to, from, repsub, repbody)
144166 end
145167
168+ # グラフメッセージの送信
169+ # _filename_ :: グラフ画像のファイル名
170+ def send_graph_reply(filename, to, smtpserver, from)
171+ if "" == filename then
172+ rep = fileread(@@repmail_graph_err)
173+ repsub = getfilesubject(rep)
174+ repbody = getfilebody(rep) + fileread(@@repmail_footer)
175+ else
176+ rep = fileread(@@repmail_graph)
177+ repsub = getfilesubject(rep)
178+ repbody = getfilebody(rep) + @@graph_url + filename + "\n" + fileread(@@repmail_footer)
179+ end
180+
181+ Debug.p "filebody = '" + repbody + "'"
182+
183+ MailControl.sendmail(smtpserver, to, from, repsub, repbody)
184+ end
185+
186+ # グラフメッセージの送信
187+ # _to_ :: メール送信先アドレス
188+ # _smtpserver_ :: SMTPサーバ名
189+ # _from_ :: メール送信元アドレス
190+ def send_graph(to, smtpserver, from)
191+ gc = GraphCreator.new(@dbh)
192+ filename = gc.createwfgraph(@@graph_dir, to)
193+
194+ send_graph_reply(filename, to, smtpserver, from)
195+ end
196+
197+ # 体重グラフメッセージの送信
198+ # _to_ :: メール送信先アドレス
199+ # _smtpserver_ :: SMTPサーバ名
200+ # _from_ :: メール送信元アドレス
201+ def send_wgraph(to, smtpserver, from)
202+ gc = GraphCreator.new(@dbh)
203+ filename = gc.createwgraph(@@graph_dir, to)
204+
205+ send_graph_reply(filename, to, smtpserver, from)
206+ end
207+
208+ # 体脂肪グラフメッセージの送信
209+ # _to_ :: メール送信先アドレス
210+ # _smtpserver_ :: SMTPサーバ名
211+ # _from_ :: メール送信元アドレス
212+ def send_fgraph(to, smtpserver, from)
213+ gc = GraphCreator.new(@dbh)
214+ filename = gc.createfgraph(@@graph_dir, to)
215+
216+ send_graph_reply(filename, to, smtpserver, from)
217+ end
218+
219+ # リセット処理メッセージの送信
220+ # _to_ :: メール送信先アドレス
221+ # _smtpserver_ :: SMTPサーバ名
222+ # _from_ :: メール送信元アドレス
223+ def send_reset(to, smtpserver, from)
224+
225+ # 当日データ全消去
226+ dsth = @dbh.prepare("DELETE FROM denergy " + \
227+ " WHERE mailadd = ? AND " + \
228+ " DATE_FORMAT(adddate, '%Y-%m-%d') = DATE_FORMAT(CURDATE(), '%Y-%m-%d')")
229+
230+ dsth.execute(to)
231+ dsth.finish
232+
233+ rep = fileread(@@repmail_reset)
234+ repsub = getfilesubject(rep)
235+ repbody = getfilebody(rep) + fileread(@@repmail_footer)
236+
237+ Debug.p "filebody = '" + repbody + "'"
238+
239+ MailControl.sendmail(smtpserver, to, from, repsub, repbody)
240+ end
241+
146242 # メールの解析
147243 # _mail_ :: メール内容の入った TMail::Mail オブジェクト
148244 # _smtpserver_ :: SMTPサーバ名
@@ -192,6 +288,42 @@
192288 return
193289 end
194290
291+ # グラフ要求っぽかったら、グラフ送信
292+ if MailAnalizer.in_ary(@@sub_graph, mailsub) \
293+ or mailbody == nil or mailbody == "" then
294+ sth.finish
295+ Debug.p "send graph."
296+ send_graph(mailfrom, smtpserver, smtpfrom)
297+ return
298+ end
299+
300+ # 体重グラフ要求っぽかったら、体重グラフ送信
301+ if MailAnalizer.in_ary(@@sub_wgraph, mailsub) \
302+ or mailbody == nil or mailbody == "" then
303+ sth.finish
304+ Debug.p "send weight graph."
305+ send_wgraph(mailfrom, smtpserver, smtpfrom)
306+ return
307+ end
308+
309+ # 体脂肪グラフ要求っぽかったら、体脂肪グラフ送信
310+ if MailAnalizer.in_ary(@@sub_fgraph, mailsub) \
311+ or mailbody == nil or mailbody == "" then
312+ sth.finish
313+ Debug.p "send fat graph."
314+ send_fgraph(mailfrom, smtpserver, smtpfrom)
315+ return
316+ end
317+
318+ # リセット要求っぽかったら、当日のデータ全消去
319+ if MailAnalizer.in_ary(@@sub_reset, mailsub) \
320+ or mailbody == nil or mailbody == "" then
321+ sth.finish
322+ Debug.p "send reset."
323+ send_reset(mailfrom, smtpserver, smtpfrom)
324+ return
325+ end
326+
195327 Debug.p "subject"
196328 Debug.p mailsub
197329
@@ -235,7 +367,7 @@
235367 isth.finish
236368 end
237369
238- elsif 2 == field.size then
370+ elsif 2 == field.size or 3 == field.size then
239371 Debug.p field
240372
241373 if MailAnalizer.in_ary(@@body_weight, field[0]) then
Show on old repository browser