cpsn 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. data/README.mkd +42 -0
  2. data/Rakefile +5 -1
  3. data/VERSION +1 -1
  4. data/bin/cpsn +116 -98
  5. metadata +7 -5
data/README.mkd ADDED
@@ -0,0 +1,42 @@
1
+ cpsn
2
+ ====
3
+
4
+ cpsn lets you query your friend status on the Playstation Network (tm) via the
5
+ command line interface. You can see friend status (online or offline), which
6
+ game they are playing, and, if available, the game mode and map they are
7
+ playing.
8
+
9
+ Setup
10
+ =====
11
+
12
+ Before you can use cpsn, you must first create a settings file for your PSN
13
+ username and password. Create a ~/.cpsn directory, and inside it, put a settings.yml file like:
14
+
15
+ ---
16
+ :username: my_psn_username
17
+ :password: my_psn_password
18
+
19
+ That's it!
20
+
21
+ Usage
22
+ =====
23
+
24
+ 'cpsn' by itself on the commandline will show you all friends on your friends
25
+ list that are online. You can optionally list one or more friend names to see
26
+ only their status, or provide a group name (see 'Defining Groups' below). You
27
+ can also pass '-o' to see your offline friends as well.
28
+
29
+ Defining Groups
30
+ ===============
31
+
32
+ If you find yourself looking for the status of a few friends frequently, you can define groups of users in your settings.yml file. Groups go under the ':groups:' section in the settings.yml file, and are the name you want to call them and a list of user names.
33
+
34
+ For example:
35
+
36
+ ---
37
+ :username: my_psn_username
38
+ :password: my_psn_password
39
+
40
+ :groups:
41
+ - mw2: [friend1, friend2, friend3]
42
+
data/Rakefile CHANGED
@@ -6,7 +6,11 @@ begin
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "cpsn"
8
8
  gem.summary = %Q{Query PSN friend status from the CLI}
9
- gem.description = %Q{Query PSN friend status from the CLI}
9
+ gem.description = %Q{
10
+ Query PSN friend status from the CLI. Shows useful information like the
11
+ game being played, and what mode or map your friend is playing
12
+ (if available).
13
+ }
10
14
  gem.email = "jbowes@repl.ca"
11
15
  gem.homepage = "http://github.com/jbowes/cpsn"
12
16
  gem.authors = ["James Bowes"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.3
1
+ 0.5.0
data/bin/cpsn CHANGED
@@ -1,4 +1,9 @@
1
1
  #!/usr/bin/ruby
2
+ #
3
+ # cpsn - Query Friend status on the Playstation Network (tm)
4
+ #
5
+ # Author:: James Bowes <jbowes@repl.ca>
6
+ # Copyright:: Copyright (C) 2009 James Bowes
2
7
 
3
8
  require 'rubygems'
4
9
  require 'mechanize'
@@ -8,119 +13,135 @@ require 'optparse'
8
13
  require 'logger'
9
14
  require 'set'
10
15
 
11
- $login_url = "https://store.playstation.com/external/index.vm?returnURL=https%3a%2f%2fsecureus.playstation.com%2fRegistration%2fPSNL%2fSignInFrame.aspx"
16
+ @login_url = "https://store.playstation.com/external/index.vm?returnURL=https%3a%2f%2fsecureus.playstation.com%2fRegistration%2fPSNL%2fSignInFrame.aspx"
12
17
  $friend_url = "http://profiles.us.playstation.com/playstation/psn/profile/friends"
13
18
  $json_url = "http://profiles.us.playstation.com/playstation/psn/profile/get_gamer_summary_data?id="
14
19
 
15
20
 
16
- $log = Logger.new(STDERR)
17
- $log.level = Logger::WARN
21
+ class Cpsn
18
22
 
19
- def load_settings()
20
- $log.debug("Loading settings")
21
- settings = YAML::parse_file(File.expand_path("~/.cpsn/settings.yml"))
22
- return settings
23
- end
23
+ attr_accessor :settings, :groups
24
+
25
+ def initialize(options)
26
+ @log = Logger.new(STDERR)
27
+ @log.level = Logger::WARN
28
+ if options[:debug]
29
+ @log.level = Logger::DEBUG
30
+ end
24
31
 
25
- def load_groups(settings)
26
- $log.debug("Loading groups")
27
- groups = {}
32
+ @settings = load_settings()
33
+ @groups = load_groups(@settings)
28
34
 
29
- if not settings[:groups]
30
- return groups
35
+ get_agent(@settings[:username].value, @settings[:password].value,
36
+ options[:cookie])
31
37
  end
32
38
 
33
- for group in settings[:groups].value
34
- name = group.value.keys[0].value
35
- vals = group.value[group.value.keys[0]]
36
- members = []
37
- mem_str = ""
38
- for user in vals.value do
39
- members << user.value
40
- mem_str += user.value
41
- mem_str += " "
42
- end
43
- $log.debug("Found group #{name} [ #{mem_str}]")
44
- groups[name] = members
39
+ def load_settings()
40
+ @log.debug("Loading settings")
41
+ settings = YAML::parse_file(File.expand_path("~/.cpsn/settings.yml"))
42
+ return settings
45
43
  end
46
- return groups
47
- end
44
+
45
+ def load_groups(settings)
46
+ @log.debug("Loading groups")
47
+ groups = {}
48
48
 
49
- def get_cookie(agent, username, password)
50
- $log.debug("Signing in for new cookie")
51
- page = agent.get($login_url)
52
- login_form = page.forms.first
53
- login_form.loginName = username
54
- login_form.password = password
55
- page = agent.submit(login_form)
56
- link = page.links.first
57
-
58
- if link.text == "Sign In"
59
- puts "Error logging in. Did you give the right username and password?"
60
- exit
49
+ if not settings[:groups]
50
+ return groups
51
+ end
52
+
53
+ for group in settings[:groups].value
54
+ name = group.value.keys[0].value
55
+ vals = group.value[group.value.keys[0]]
56
+ members = []
57
+ mem_str = ""
58
+ for user in vals.value do
59
+ members << user.value
60
+ mem_str += user.value
61
+ mem_str += " "
62
+ end
63
+ @log.debug("Found group #{name} [ #{mem_str}]")
64
+ groups[name] = members
65
+ end
66
+ return groups
61
67
  end
62
68
 
63
- page = link.click
64
-
65
- agent.cookie_jar.save_as File.expand_path("~/.cpsn/cookies.yml")
66
- end
69
+ def get_cookie(username, password)
70
+ @log.debug("Signing in for new cookie")
71
+ page = @agent.get(@login_url)
72
+ login_form = page.forms.first
73
+ login_form.loginName = username
74
+ login_form.password = password
75
+ page = @agent.submit(login_form)
76
+ link = page.links.first
77
+
78
+ if link.text == "Sign In"
79
+ puts "Error logging in. Did you give the right username and password?"
80
+ exit
81
+ end
82
+
83
+ page = link.click
84
+
85
+ @agent.cookie_jar.save_as File.expand_path("~/.cpsn/cookies.yml")
86
+ end
67
87
 
68
- def get_agent(username, password, force_cookie)
69
- $log.debug("Creating new user agent")
70
- agent = WWW::Mechanize.new
71
- agent.user_agent_alias = 'Mac FireFox'
72
- agent.redirect_ok = true
88
+ def get_agent(username, password, force_cookie)
89
+ @log.debug("Creating new user agent")
90
+ @agent = WWW::Mechanize.new
91
+ @agent.user_agent_alias = 'Mac FireFox'
92
+ @agent.redirect_ok = true
73
93
 
74
- if File.exist? File.expand_path("~/.cpsn/cookies.yml") and not force_cookie
75
- agent.cookie_jar.load File.expand_path("~/.cpsn/cookies.yml")
76
- return agent
94
+ if File.exist? File.expand_path("~/.cpsn/cookies.yml") and not force_cookie
95
+ @agent.cookie_jar.load File.expand_path("~/.cpsn/cookies.yml")
96
+ else
97
+ get_cookie(username, password)
98
+ end
77
99
  end
78
100
 
79
- get_cookie(agent, username, password)
80
- return agent
81
- end
101
+ def get_friends()
102
+ @log.debug("Getting friends list")
103
+ page = @agent.get($friend_url)
104
+ divs = page.search("div.slotcontent")
82
105
 
83
- def get_friends(agent)
84
- $log.debug("Getting friends list")
85
- page = agent.get($friend_url)
86
- divs = page.search("div.slotcontent")
106
+ friends = []
107
+ for div in divs
108
+ friend = div.attributes["id"]
109
+ friends << friend
110
+ @log.debug("Found friend #{friend}")
111
+ end
87
112
 
88
- friends = []
89
- for div in divs
90
- friend = div.attributes["id"]
91
- friends << friend
92
- $log.debug("Found friend #{friend}")
93
- end
113
+ return friends
114
+ end
94
115
 
95
- return friends
96
- end
116
+ def get_friend_status(friend)
117
+ @log.debug("Loading friend status for #{friend}")
118
+ page = @agent.get($json_url + friend)
119
+ data = JSON.parse(page.body)
97
120
 
98
- def get_friend_status(agent, friend)
99
- $log.debug("Loading friend status for #{friend}")
100
- page = agent.get($json_url + friend)
101
- data = JSON.parse(page.body)
121
+ @log.debug(data)
102
122
 
103
- $log.debug(data)
123
+ friend = {:name => data["userName"]}
104
124
 
105
- friend = {:name => data["userName"]}
125
+ if data["onlineStatus"] == nil
126
+ return nil
127
+ end
106
128
 
107
- if data["onlineStatus"] == nil
108
- return nil
109
- end
129
+ if data["onlineStatus"]["extensionStatus"] != nil
130
+ friend[:status] = 'online'
131
+ friend[:playing] = data["onlineStatus"]["extensionStatus"]["title"]
132
+ friend[:game_status] = data["onlineStatus"]["extensionStatus"]["status"]
133
+ else
134
+ friend[:status] = 'offline'
135
+ friend[:playing] = ""
136
+ friend[:game_status] = ""
137
+ end
110
138
 
111
- if data["onlineStatus"]["extensionStatus"] != nil
112
- friend[:status] = 'online'
113
- friend[:playing] = data["onlineStatus"]["extensionStatus"]["title"]
114
- friend[:game_status] = data["onlineStatus"]["extensionStatus"]["status"]
115
- else
116
- friend[:status] = 'offline'
117
- friend[:playing] = ""
118
- friend[:game_status] = ""
139
+ return friend
119
140
  end
120
141
 
121
- return friend
122
142
  end
123
143
 
144
+
124
145
  options = {}
125
146
  optparse = OptionParser.new do |opts|
126
147
  options[:offline] = false
@@ -128,8 +149,9 @@ optparse = OptionParser.new do |opts|
128
149
  options[:offline] = true
129
150
  end
130
151
 
152
+ options[:debug] = false
131
153
  opts.on('-d', '--debug', 'Show debugging information') do
132
- $log.level = Logger::DEBUG
154
+ options[:debug] = true
133
155
  end
134
156
 
135
157
  options[:cookie] = false
@@ -153,29 +175,25 @@ end
153
175
 
154
176
  optparse.parse!
155
177
 
156
- settings = load_settings()
157
- groups = load_groups(settings)
158
- agent = get_agent(settings[:username].value, settings[:password].value,
159
- options[:cookie])
178
+ cpsn = Cpsn.new(options)
160
179
 
161
180
  if ARGV.length >= 1
162
181
  friend_names = Set.new []
163
182
  args = ARGV[0..-1]
164
183
  for arg in args
165
- if groups.has_key? arg
166
- friend_names.merge(groups[arg])
184
+ if cpsn.groups.has_key? arg
185
+ friend_names.merge(cpsn.groups[arg])
167
186
  else
168
187
  friend_names.add(arg)
169
188
  end
170
189
  end
171
190
  else
172
191
  begin
173
- friend_names = get_friends(agent)
192
+ friend_names = cpsn.get_friends()
174
193
  rescue WWW::Mechanize::ResponseCodeError => response
175
- puts response.response_code
176
194
  if response.response_code == '403'
177
- get_cookie(agent, settings[:username].value,
178
- settings[:password].value)
195
+ cpsn.get_cookie(cpsn.settings[:username].value,
196
+ cpsn.settings[:password].value)
179
197
  retry
180
198
  end
181
199
  end
@@ -183,11 +201,11 @@ end
183
201
 
184
202
  for friend_name in friend_names
185
203
  begin
186
- friend = get_friend_status(agent, friend_name)
204
+ friend = cpsn.get_friend_status(friend_name)
187
205
  rescue WWW::Mechanize::ResponseCodeError => response
188
206
  if response.response_code == '403'
189
- get_cookie(agent, settings[:username].value,
190
- settings[:password].value)
207
+ cpsn.get_cookie(cpsn.settings[:username].value,
208
+ cpsn.settings[:password].value)
191
209
  retry
192
210
  end
193
211
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpsn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Bowes
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-21 00:00:00 -05:00
12
+ date: 2009-11-22 00:00:00 -05:00
13
13
  default_executable: cpsn
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,16 +32,18 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.1.7
34
34
  version:
35
- description: Query PSN friend status from the CLI
35
+ description: "\n Query PSN friend status from the CLI. Shows useful information like the\n game being played, and what mode or map your friend is playing\n (if available).\n "
36
36
  email: jbowes@repl.ca
37
37
  executables:
38
38
  - cpsn
39
39
  extensions: []
40
40
 
41
- extra_rdoc_files: []
42
-
41
+ extra_rdoc_files:
42
+ - README.mkd
43
+ - TODO
43
44
  files:
44
45
  - .gitignore
46
+ - README.mkd
45
47
  - Rakefile
46
48
  - TODO
47
49
  - VERSION