Mercurial > isshouni
annotate isshouni.js @ 6:377a9b42226a default tip
Add logging fonctions and don’t listen to messages from the room itself.
| author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
|---|---|
| date | Thu, 23 Feb 2012 23:51:31 +0100 |
| parents | 4a063df30be9 |
| children |
| rev | line source |
|---|---|
| 0 | 1 #!/usr/bin/env node |
| 2 'use strict'; | |
| 3 | |
| 4 /** | |
| 5 Copyright (c) 2012, Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> | |
| 6 | |
| 7 Permission to use, copy, modify, and/or distribute this software for any | |
| 8 purpose with or without fee is hereby granted, provided that the above | |
| 9 copyright notice and this permission notice appear in all copies. | |
| 10 | |
| 11 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| 12 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| 13 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| 14 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| 15 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| 16 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| 17 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| 18 */ | |
| 19 | |
|
4
e6f5077c2ea9
Display an error message when there is no video, and fix exit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
20 if (process.argv.length < 3) { |
|
e6f5077c2ea9
Display an error message when there is no video, and fix exit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
21 console.log('You should put at least a video on your command line.'); |
|
e6f5077c2ea9
Display an error message when there is no video, and fix exit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
22 process.exit(); |
|
e6f5077c2ea9
Display an error message when there is no video, and fix exit.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3
diff
changeset
|
23 } |
| 0 | 24 |
| 25 var config = require('./config'); | |
| 26 var args = ['-slave'].concat(process.argv.slice(2)); | |
| 27 | |
| 28 var tty = require('tty'); | |
| 29 var xmpp = require('node-xmpp'); | |
| 30 var JID = require('./jid'); | |
| 31 var spawn = require('child_process').spawn; | |
| 32 | |
| 33 var cl = new xmpp.Client(config); | |
| 34 var mplayer = spawn('mplayer', args); | |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
35 var paused = false; |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
36 var connected = false; |
| 0 | 37 |
| 38 var connect = function() { | |
| 39 cl.send(new xmpp.Element('presence', {to: config.muc + '/' + config.nick}) | |
| 40 .c('x', {xmlns: 'http://jabber.org/protocol/muc'}) | |
| 41 .c('history', {maxchars: '0'}) | |
| 42 .up()); | |
| 43 //TODO: handle join errors. | |
| 44 }; | |
| 45 cl.on('online', connect); | |
| 46 | |
| 47 var disconnect = function() { | |
| 48 cl.send(new xmpp.Element('presence', {to: config.muc + '/' + config.nick, type: 'unavailable'})); | |
| 49 process.stdin.end(); | |
| 50 cl.end(); | |
| 5 | 51 |
| 52 tty.setRawMode(false); | |
| 53 setTimeout(process.exit, 1000); | |
| 0 | 54 }; |
| 55 | |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
56 var send_message = function(name, arg, type) { |
| 0 | 57 //console.log('SENT: ' + name + ' ' + arg); |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
58 if (!type) |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
59 type = 'groupchat'; |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
60 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
61 var message = new xmpp.Element('message', {to: config.muc, type: type}) |
| 0 | 62 .c(name, {xmlns: 'urn:linkmauve:player'}); |
| 63 | |
| 64 if (arg) | |
| 65 message.t(arg); | |
| 66 | |
| 67 cl.send(message.up()); | |
| 68 }; | |
| 69 | |
| 70 var send_command = function(text) { | |
| 71 //console.log(text); | |
| 72 mplayer.stdin.write(text + '\n'); | |
| 73 }; | |
| 74 | |
| 75 cl.on('stanza', function(stanza) { | |
|
6
377a9b42226a
Add logging fonctions and don’t listen to messages from the room itself.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
76 console.log(stanza.toString()); |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
77 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
78 var type = stanza.attrs['type']; |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
79 var from = new JID(stanza.attrs['from']); |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
80 var id = stanza.attrs['id'] || ''; |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
81 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
82 if (stanza.is('iq') && (type === 'get' || type === 'set')) |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
83 return cl.send(new xmpp.Element('iq', {to: from, id: id, type: 'error'}) |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
84 .c('error', {type: 'cancel'}) |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
85 .c('service-unavailable', {xmlns: 'urn:ietf:params:xml:ns:xmpp-stanzas'}) |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
86 .up() |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
87 .up()); |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
88 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
89 if (from.bare !== config.muc) |
| 0 | 90 return; |
| 91 | |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
92 if (stanza.is('presence') && type !== 'unavailable') |
|
3
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
93 return on_presence(from, stanza); |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
94 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
95 if (stanza.is('message')) |
|
3
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
96 return on_message(from, stanza); |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
97 }); |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
98 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
99 var on_message = function(from, stanza) { |
|
6
377a9b42226a
Add logging fonctions and don’t listen to messages from the room itself.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
100 if (from.resource && from.resource === config.nick) |
| 0 | 101 return; |
| 102 | |
| 103 var message = stanza.getChild('body'); | |
| 104 if (message) | |
|
3
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
105 message = message.getText(); |
|
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
106 if (message) |
|
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
107 send_command('osd_show_text "' + from.resource + ': ' + message + '"'); |
| 0 | 108 |
| 109 var payload = stanza.getChild(null, 'urn:linkmauve:player'); | |
| 110 if (!payload) | |
| 111 return; | |
| 112 | |
|
6
377a9b42226a
Add logging fonctions and don’t listen to messages from the room itself.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
113 send_command('osd_show_text "' + from.resource + ' did ' + payload.name + '"'); |
| 0 | 114 |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
115 if (payload.name === 'pause') { |
| 0 | 116 send_command('pause'); |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
117 paused = !paused; |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
118 } else if (payload.name === 'seek') |
| 0 | 119 send_command('seek ' + payload.getText()); |
| 120 else if (payload.name === 'synchro') | |
| 121 send_command('seek ' + payload.getText() + ' 2'); | |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
122 }; |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
123 |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
124 var on_presence = function(from, stanza) { |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
125 if (from.resource === config.nick) { |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
126 connected = true; |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
127 return; |
|
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
128 } |
|
3
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
129 if (!connected) |
|
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
130 return; |
|
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
131 |
| 5 | 132 /*console.log('New participant: ' + from.resource); |
|
3
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
133 |
|
0082e861cf16
Fix text message handling and new participant.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
2
diff
changeset
|
134 if (paused) |
| 5 | 135 send_message('paused', undefined, 'chat');*/ |
|
2
88eb49491a1e
Reply to iq, and better split code.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
136 }; |
| 0 | 137 |
| 138 cl.on('error', function(e) { | |
| 139 console.log(e); | |
| 140 }); | |
| 141 | |
| 142 var commands = { | |
| 143 '+': 'volume 1', | |
| 144 '-': 'volume -1', | |
| 145 'm': 'mute', | |
| 146 ' ': function() { | |
| 147 send_message('pause'); | |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
148 paused = !paused; |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
149 console.log(paused); |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
150 if (paused) |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
151 send_command('get_time_pos'); |
| 0 | 152 return 'pause'; |
| 153 }, | |
| 154 'q': function() { | |
| 155 disconnect(); | |
| 156 return 'quit'; | |
| 157 }, | |
| 158 }; | |
| 159 | |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
160 var seek = function(time) { |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
161 send_message('seek', time); |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
162 send_command('seek ' + time); |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
163 }; |
|
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
164 |
| 0 | 165 process.stdin.resume(); |
| 166 tty.setRawMode(true); | |
| 167 process.stdin.on('keypress', function(char, key) { | |
| 168 if (!char) { | |
| 169 if (key.name == 'right') | |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
170 seek(10); |
| 0 | 171 else if (key.name == 'left') |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
172 seek(-10); |
| 0 | 173 else if (key.name == 'up') |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
174 seek(60); |
| 0 | 175 else if (key.name == 'down') |
|
1
617063bc96f7
Fix some sync issues.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
176 seek(-60); |
| 0 | 177 } else if (char in commands) { |
| 178 var command = commands[char]; | |
| 179 if (typeof command === 'function') | |
| 180 command = command(); | |
| 181 send_command(command); | |
| 182 } | |
| 183 }); | |
| 184 | |
| 185 mplayer.stdout.on('data', function(data) { | |
| 186 //console.log('DATA: '+data); | |
| 187 data = /(ANS_TIME_POSITION)=([0-9\.]+)/.exec(data); | |
| 188 if (!data) | |
| 189 return; | |
| 190 | |
| 191 var cmd = data[1]; | |
| 192 var arg = data[2]; | |
| 193 if (cmd === 'ANS_TIME_POSITION') | |
| 194 send_message('synchro', arg); | |
| 195 }); |
