• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

command line interface based Twitter client


Commit MetaInfo

修訂c73b1f92a94573af44b1f954bbd42f1c117b928d (tree)
時間2012-12-19 23:44:47
作者hylom <hylom@hylo...>
Commiterhylom

Log Message

update comments

Change Summary

差異

--- a/auth.js
+++ b/auth.js
@@ -59,80 +59,52 @@ function authenticate(callback) {
5959 }
6060
6161 /*
62- * ntwitter.Twitterクラスのインスタンスを生成する
63- * @param {Object} keys アクセスに使用するキー
64- * @returns 作成されたインスタンス
65- */
66-function createTwitterClient(keys) {
67- var twitter = new Twitter(keys);
68- return twitter;
69-}
70-
71-/*
72- * .accountファイルにアクセストークン情報を書き出す
73- * @param {Object} twitter ntwitter.Twitterクラスのインスタンス
74- * @param {Function(err)} callback エラーオブジェクトを返すコールバック関数
75- */
76-function writeAuthenticationKeys(twitter, callback) {
77- var keys = {
78- access_token_key: twitter.options.access_token_key,
79- access_token_secret: twitter.options.access_token_secret
80- };
81- fs.writeFile(configFile, JSON.stringify(keys, null, 2), 'utf8', callback);
82-}
83-
84-/*
85- * .accountファイルに保存しておいたアクセストークン情報を読み出す
86- * @param {Function(err, key)} callback コールバック関数。
87- * err引数にはエラーオブジェクトが、
88- * keys引数には読み出したアクセストークン情報を格納するオブジェクト
89- * 格納される
90- */
91-function readAuthenticationKeys(callback) {
92- fs.readFile(configFile, 'utf8', function (err, data) {
93- if (err) {
94- callback(err);
95- return;
96- }
97- var keys = JSON.parse(data);
98- callback(err, keys);
99- });
100-}
101-
102-/*
10362 * 認証を行ってntwitter.Twitterクラスのインスタンスを返す
10463 * @param {Function(err, twitter)} callback コールバック関数
10564 * err引数にはエラーオブジェクトが、
10665 * twitter引数には作成されたインスタンスが格納される
10766 */
108-exports.authenticate = function (callback) {
67+exports.getClient = function (callback) {
10968 var keys = {
11069 consumer_key: consumerKey,
11170 consumer_secret: consumerSecret
11271 };
11372 // ファイルに保存しておいたアクセストークンを読み出す
114- readAuthenticationKeys(function (err, data) {
73+ fs.readFile(configFile, 'utf8', function (err, data) {
11574 // 読み出しに失敗したら認証を実行する
116- if (err || data.access_token_key === undefined
117- || data.access_token_secret === undefined ) {
75+ if (err) {
11876 authenticate(function (err, token, secret) {
11977 if (err) {
12078 callback(err);
79+ return;
12180 }
81+
82+ // クライアントを作成する
12283 keys.access_token_key = token;
12384 keys.access_token_secret = secret;
124- var twitter = createTwitterClient(keys);
85+ var twitter = new Twitter(keys);
86+
12587 // アクセストークンをファイルに保存しておく
126- writeAuthenticationKeys(twitter, function (err) {
88+ var tokens = {
89+ access_token_key: keys.access_token_key,
90+ access_token_secret: keys.access_token_secret
91+ };
92+ var jsonString = JSON.stringify(tokens, null, 2);
93+ fs.writeFile(configFile, jsonString, 'utf8', function (err) {
94+ // 処理完了
12795 callback(err, twitter);
12896 });
12997 });
13098 return;
13199 }
132100 // 読み出しに成功したらその値からクライアントを作成する
133- keys.access_token_key = data.access_token_key;
134- keys.access_token_secret = data.access_token_secret;
135- var twitter = createTwitterClient(keys);
101+ var token = JSON.parse(data);
102+ keys.access_token_key = token.access_token_key;
103+ keys.access_token_secret = token.access_token_secret;
104+ var twitter = new Twitter(keys);
105+
106+ // 処理完了
136107 callback(null, twitter);
137108 });
138-}
109+};
110+
--- a/clitweets.js
+++ b/clitweets.js
@@ -1,8 +1,8 @@
11 #!/usr/local/bin/node
22
3-var auth = require('./auth');
43 var readline = require('readline');
54
5+var auth = require('./auth');
66 var tweetWriter = require('./tweetwriter');
77
88 var rl = null;
@@ -20,7 +20,7 @@ var mode = {
2020 }
2121 }
2222
23-// タイムラインモードを定義
23+// timelineモードを定義
2424 var timeline = {
2525 start: function () {
2626 if (rl !== null) {
@@ -29,6 +29,7 @@ var timeline = {
2929 }
3030 tweetWriter.resume();
3131 process.stdin.once('data', function () {
32+ // commandモードに遷移
3233 mode.start(command);
3334 });
3435 process.stdin.resume();
@@ -38,7 +39,7 @@ var timeline = {
3839 }
3940 };
4041
41-// コマンドラインモードを定義
42+// commandモードを定義
4243 var command = {
4344 start: function () {
4445 rl = readline.createInterface({
@@ -61,42 +62,52 @@ var command = {
6162 exit: function () {
6263 },
6364 line: function (data) {
65+ // 入力された文字列に応じて処理を切り替える
6466 switch(data) {
6567 case 'tweet':
68+ // writeMessageモードを開始する
6669 mode.start(writeMessage);
6770 break;
6871 case 'quit':
72+ // アプリケーションを終了する
6973 process.exit(0);
7074 case '':
75+ // timelineモードに遷移する
7176 mode.start(timeline);
7277 break;
7378 default:
79+ // エラーメッセージを表示してtimelineモードに遷移する
7480 process.stdout.write('invalid command: ' + data + '\n');
7581 mode.start(timeline);
7682 break;
7783 }
7884 },
7985 SIGINT: function () {
86+ // Ctrl-Cを受け付けたらtimelineモードに遷移する
8087 mode.start(timeline);
8188 }
8289 }
8390
84-// tweet入力モードを定義
91+// writeMessageモードを定義
8592 var newMessage = '';
8693 var writeMessage = {
8794 start: function () {
95+ newMessage = '';
96+
97+ // readlineインターフェイスのイベントハンドラの付け替えを行う
8898 rl.removeAllListeners('line');
8999 rl.removeAllListeners('SIGINT');
90100 rl.on('line', this.line);
91101 rl.on('SIGINT', this.SIGINT);
102+
92103 rl.setPrompt('tweet> ');
93104 process.stdout.write('write tweet message and push Ctrl-C.\n');
94- newMessage = '';
95105 rl.prompt();
96106 },
97107 exit: function () {
98108 },
99109 line: function (data) {
110+ // 入力したメッセージを保存しておく
100111 if (newMessage === '') {
101112 newMessage = data;
102113 } else {
@@ -105,10 +116,15 @@ var writeMessage = {
105116 rl.prompt();
106117 },
107118 SIGINT: function () {
119+ // Ctrl-Cを受け付けたらメッセージの入力を終了する
108120 process.stdout.write('\n----\n');
109121 process.stdout.write(newMessage + '\n');
110122 process.stdout.write('----\n');
123+
124+ // メッセージを表示し、投稿するかどうかを確認する
111125 var message = 'tweet this message? (y:yes/n:no) ';
126+ rl.question(message, onAnswer);
127+
112128 function onAnswer(answer) {
113129 if (answer === 'y') {
114130 twitter.updateStatus(newMessage, {}, function (err, data) {
@@ -122,18 +138,23 @@ var writeMessage = {
122138 rl.question(message, onAnswer);
123139 }
124140 }
125- rl.question(message, onAnswer);
141+
126142 }
127143 }
128144
129-// User streamによるタイムライン受信を開始
130-function startUserStream() {
145+// ntwitter.Twitterクラスのインスタンスを生成して処理を開始する
146+auth.getClient(function (err, twit) {
147+ twitter = twit;
148+
149+ // タイムライン最新20件を取得する
131150 twitter.getHomeTimeline({}, function (err, data) {
132151 if (err) {
133152 throw err;
134153 }
135154 tweetWriter.write(data.reverse());
136155 });
156+
157+ // User streamを使ったタイムライン受信を開始する
137158 twitter.stream('user', {}, function (stream) {
138159 stream.on('data', function (data) {
139160 tweetWriter.write(data);
@@ -142,14 +163,6 @@ function startUserStream() {
142163 console.log(err);
143164 });
144165 });
145-};
146-
147-// ntwitter.Twitterクラスのインスタンスを生成する
148-auth.authenticate(function (err, twit) {
149- twitter = twit;
150-
151- // User streamを使ったタイムライン受信の開始
152- startUserStream();
153166
154167 // タイムラインモードを開始
155168 mode.start(timeline);
--- a/tweetwriter.js
+++ b/tweetwriter.js
@@ -1,9 +1,12 @@
1-// tweetの書き込みを行うモジュール
1+var util = require('util');
22
33 var buffer = [];
4-var util = require('util');
54 var writable = false;
65
6+/*
7+ * tweetをコンソールに出力する
8+ * @param {Object|Array} tweet 出力するtweet、もしくはその配列
9+ */
710 exports.write = function (tweet) {
811 if (util.isArray(tweet)) {
912 tweet.forEach(_write);
@@ -12,6 +15,25 @@ exports.write = function (tweet) {
1215 }
1316 };
1417
18+/*
19+ * tweetのコンソールへの出力を再開する
20+ */
21+exports.resume = function () {
22+ buffer.forEach(function (data) {
23+ process.stdout.write(data);
24+ });
25+ buffer = [];
26+ writable = true;
27+},
28+
29+/*
30+ * tweetのコンソールへの出力を一時停止する
31+ */
32+exports.pause = function () {
33+ writable = false;
34+}
35+
36+// tweetを整形して出力する
1537 function _write(tweet) {
1638 if (tweet.user === undefined) {
1739 return;
@@ -24,6 +46,8 @@ function _write(tweet) {
2446 _push('\n');
2547 }
2648
49+// コンソールへの書き出しが許可されていれば文字列を出力し
50+// 許可されていなければバッファに格納する
2751 function _push(data) {
2852 if (writable) {
2953 process.stdout.write(data);
@@ -31,15 +55,3 @@ function _push(data) {
3155 buffer.push(data);
3256 }
3357 };
34-
35-exports.resume = function () {
36- buffer.forEach(function (data) {
37- process.stdout.write(data);
38- });
39- buffer = [];
40- writable = true;
41-},
42-
43-exports.pause = function () {
44- writable = false;
45-}