annotate plugins/plugin_misc_cs.py @ 199:58f96e66ec17

wix: unicode fixes in contact list
author Goffi <goffi@goffi.org>
date Fri, 20 Aug 2010 01:12:43 +0800
parents 18b0cf49a6f1
children 5c68a65548c3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
3
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
4 """
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
5 SAT plugin for managing xep-0045
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
6 Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org)
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
7
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
8 This program is free software: you can redistribute it and/or modify
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
10 the Free Software Foundation, either version 3 of the License, or
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
11 (at your option) any later version.
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
12
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
16 GNU General Public License for more details.
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
17
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
20 """
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
21
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from logging import debug, info, warning, error
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from twisted.words.xish import domish
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from twisted.internet import protocol, defer, threads, reactor
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.words.protocols.jabber import client, jid, xmlstream
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from twisted.words.protocols.jabber import error as jab_error
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from twisted.words.protocols.jabber.xmlstream import IQ
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from twisted.web.client import getPage
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
29 import os.path
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
30 import pdb
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
31 import random
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
32
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
33 from zope.interface import implements
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
34
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
35 from wokkel import disco, iwokkel, data_form
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
36 from tools.xml_tools import XMLUI
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
37 import urllib
108
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
38 import webbrowser
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
39
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
40 from BeautifulSoup import BeautifulSoup
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
41 import re
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
42
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
43
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
44 PLUGIN_INFO = {
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
45 "name": "CouchSurfing plugin",
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
46 "import_name": "CS",
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
47 "type": "Misc",
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
48 "protocols": [],
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
49 "dependencies": [],
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
50 "main": "CS_Plugin",
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
51 "handler": "no",
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
52 "description": _(u"""This plugin allow to manage your CouchSurfing account throught your SàT frontend""")
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
53 }
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
54
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
55 AGENT = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3'
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
56
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
57 class CS_Plugin():
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
58
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
59 params = """
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
60 <params>
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
61 <individual>
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
62 <category name="CouchSurfing">
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
63 <param name="Login" type="string" />
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
64 <param name="Password" type="password" />
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
65 </category>
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
66 </individual>
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
67 </params>
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
68 """
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
69
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
70 def __init__(self, host):
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
71 info(_("Plugin CS initialization"))
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
72 self.host = host
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
73 #parameters
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
74 host.memory.importParams(CS_Plugin.params)
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
75 #menu
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
76 host.importMenu(_("Plugin"), "CouchSurfing", self.menuSelected, help_string = _("Launch CoushSurfing mangement interface"))
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
77 self.data=self.host.memory.getPrivate('plugin_cs_data') or {} #TODO: delete cookies/data after a while
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
78 self.host.registerGeneralCB("plugin_CS_sendMessage", self.sendMessage)
108
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
79 self.host.registerGeneralCB("plugin_CS_showUnreadMessages", self.showUnreadMessages)
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
80
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
81 def erroCB(self, e, id):
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
82 """Called when something is going wrong when contacting CS website"""
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
83 #pdb.set_trace()
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
84 message_data={"reason": "connection error", "message":_(u"Impossible to contact CS website, please check your login/password, connection or try again later")}
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
85 self.host.bridge.actionResult("ERROR", id, message_data)
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
86
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
87 def menuSelected(self, id, profile):
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
88 """Called when the couchsurfing menu item is selected"""
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
89 login = self.host.memory.getParamA("Login", "CouchSurfing", profile_key=profile)
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
90 password = self.host.memory.getParamA("Password", "CouchSurfing", profile_key=profile)
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
91 if not login or not password:
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
92 message_data={"reason": "uncomplete", "message":_(u"You have to fill your CouchSurfing login & password in parameters before using this interface")}
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
93 self.host.bridge.actionResult("ERROR", id, message_data)
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
94 return
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
95
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
96 post_data = urllib.urlencode({'auth_login[un]':login,'auth_login[pw]':password,'auth_login[action]':'Login...'})
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
97
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
98 if not self.data.has_key(profile):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
99 self.data[profile] = {'cookies':{}}
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
100 else:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
101 self.data[profile]['cookies'] = {}
101
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
102
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
103
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
104
783e9d6980ec Couchsurfing plugin: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
105
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
106
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
107 #tmp
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
108 """f = open('/home/goffi/tmp/CS_principale.html','r')
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
109 html = f.read()
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
110 self.__connectionCB(html, id, profile)"""
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
111
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
112 d = getPage('http://www.couchsurfing.org/login.html', method='POST', postdata=post_data, headers={'Content-Type':'application/x-www-form-urlencoded'} , agent=AGENT, cookies=self.data[profile]['cookies'])
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
113 d.addCallback(self.__connectionCB, id, profile)
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
114 d.addErrback(self.erroCB, id)
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
115
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
116
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
117 #self.host.bridge.actionResult("SUPPRESS", id, {})
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
118
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
119
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
120 #pages parsing callbacks
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
121 def savePage(self, name, html):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
122 f = open ('/home/goffi/tmp/CS_'+name+'.html','w')
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
123 f.write(html)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
124 f.close()
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
125 print "page [%s] sauvee" % name
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
126 #pdb.set_trace()
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
127
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
128 def __connectionCB(self, html, id, profile):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
129 print 'Response received'
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
130 self.savePage('principale',html)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
131 soup = BeautifulSoup(html)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
132 self.data[profile]['user_nick'] = soup.find('a','item_link',href='/home.html').contents[0]
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
133 self.data[profile]['user_name'] = soup.html.head.title.string.split(' - ')[1]
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
134 #unread messages
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
135 try:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
136 self.data[profile]['unread_messages'] = int(soup.find(lambda tag: tag.name=='div' and ('class','item_bubble') in tag.attrs and tag.find('a', href="/messages.html?message_status=inbox")).find(text=True))
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
137 except:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
138 self.data[profile]['unread_messages'] = 0
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
139 #unread couchrequest messages
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
140 try:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
141 self.data[profile]['unread_CR_messages'] = int(soup.find(lambda tag: tag.name=='div' and ('class','item_bubble') in tag.attrs and tag.find('a', href="/couchmanager")).find(text=True))
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
142 except:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
143 self.data[profile]['unread_CR_messages'] = 0
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
144
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
145 #if we have already the list of friend, no need to make new requests
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
146 if not self.data[profile].has_key('friends'):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
147 self.data[profile]['friends'] = {}
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
148 """f = open('/home/goffi/tmp/CS_friends.html','r')
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
149 html = f.read()
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
150 self.__friendsPageCB(html, id, profile)"""
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
151 d = getPage('http://www.couchsurfing.org/connections.html?type=myfriends&show=10000', agent=AGENT, cookies=self.data[profile]['cookies'])
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
152 d.addCallback(self.__friendsPageCB, id=id, profile=profile)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
153 d.addErrback(self.erroCB, id)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
154 else:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
155 self.host.bridge.actionResult("XMLUI", id, {"type":"window", "xml":self.__buildUI(self.data[profile])})
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
156
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
157 def __buildUI(self, data):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
158 """Build the XML UI of the plugin
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
159 @param data: data store for the profile"""
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
160 user_nick = data['user_nick']
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
161 user_name = data['user_name']
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
162 unread_mess = data['unread_messages']
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
163 unread_CR_mess = data['unread_CR_messages']
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
164 friends_list = data['friends'].keys()
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
165 friends_list.sort()
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
166 interface = XMLUI('window','tabs', title='CouchSurfing management')
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
167 interface.addCategory(_("Messages"), "vertical")
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
168 interface.addText(_("G'day %(name)s, you have %(nb_message)i unread message%(plural_mess)s and %(unread_CR_mess)s unread couch request message%(plural_CR)s\nIf you want to send a message, select the recipient(s) in the list below") % {'name':user_name, 'nb_message':unread_mess, 'plural_mess':'s' if unread_mess>1 else '', 'unread_CR_mess': unread_CR_mess, 'plural_CR':'s' if unread_CR_mess>1 else ''})
108
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
169 if unread_mess:
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
170 interface.addButton('plugin_CS_showUnreadMessages', 'showUnreadMessages', _('Show unread message%(plural)s in external web browser') % {'plural':'s' if unread_mess>1 else ''})
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
171 interface.addList(friends_list, 'friends', style=['multi'])
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
172 interface.changeLayout('pairs')
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
173 interface.addLabel(_("Subject"))
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
174 interface.addString('subject')
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
175 interface.changeLayout('vertical')
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
176 interface.addLabel(_("Message"))
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
177 interface.addText("(use %name% for contact name and %firstname% for guessed first name)")
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
178 interface.addTextBox('message')
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
179 interface.addButton('plugin_CS_sendMessage', 'sendMessage', _('send'), fields_back=['friends','subject','message'])
109
18b0cf49a6f1 Plugin CS minor changes (Events & Couch Search tabs temporarly removed, open_new_tab user to open link in browser)
Goffi <goffi@goffi.org>
parents: 108
diff changeset
180 #interface.addCategory(_("Events"), "vertical") #TODO: coming soon, hopefuly :)
18b0cf49a6f1 Plugin CS minor changes (Events & Couch Search tabs temporarly removed, open_new_tab user to open link in browser)
Goffi <goffi@goffi.org>
parents: 108
diff changeset
181 #interface.addCategory(_("Couch search"), "vertical")
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
182 return interface.toXml()
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
183
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
184 def __meetingPageCB(self, html):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
185 """Called when the meeting page has been received"""
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
186
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
187 def __friendsPageCB(self, html, id, profile):
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
188 """Called when the friends list page has been received"""
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
189 self.savePage('friends',html)
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
190 soup = BeautifulSoup(html.replace('"formtable width="400','"formtable" width="400"')) #CS html fix #TODO: report the bug to CS dev team
106
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
191 friends = self.data[profile]['friends']
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
192 for _tr in soup.findAll('tr', {'class':re.compile("^msgRow*")}): #we parse the row with friends infos
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
193 _nobr = _tr.find('nobr') #contain the friend name
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
194 friend_name = unicode(_nobr.string)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
195 friend_link = u'http://www.couchsurfing.org'+_nobr.parent['href']
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
196 regex_href = re.compile(r'/connections\.html\?id=([^&]+)')
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
197 a_tag = _tr.find('a',href=regex_href)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
198 friend_id = regex_href.search(unicode(a_tag)).groups()[0]
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
199
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
200 debug(_("CS friend found: %(friend_name)s (id: %(friend_id)s, link: %(friend_link)s)") % {'friend_name':friend_name, 'friend_id':friend_id, 'friend_link':friend_link})
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
201 friends[friend_name] = {'link':friend_link,'id':friend_id}
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
202 a = soup.find('td','barmiddle next').a #is there several pages ?
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
203 if a:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
204 #yes, we parse the next page
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
205 d = getPage('http://www.couchsurfing.org/'+str(a['href']), agent=AGENT, cookies=self.data[profile]['cookies'])
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
206 d.addCallback(self.__friendsPageCB, id=id, profile=profile)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
207 d.addErrback(self.erroCB, id)
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
208 else:
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
209 #no, we show the result
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
210 self.host.bridge.actionResult("XMLUI", id, {"type":"window", "xml":self.__buildUI(self.data[profile])})
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
211 #and save the data
138d82f64b6f plugin CS: friends parsing
Goffi <goffi@goffi.org>
parents: 103
diff changeset
212 self.host.memory.setPrivate('plugin_cs_data', self.data)
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
213
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
214 def __sendMessage(self, answer, subject, message, data, recipient_list, id, profile):
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
215 """Send actually the message
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
216 @param subject: subject of the message
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
217 @param message: body of the message
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
218 @param data: data of the profile
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
219 @param recipient_list: list of friends names, names are removed once message is sent
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
220 @param id: id of the action
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
221 @param profile: profile who launched the action
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
222 """
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
223 if answer:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
224 if not 'Here is a copy of the email that was sent' in answer:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
225 error(_("INTERNAL ERROR: no confirmation of message sent by CS, maybe the site has been modified ?"))
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
226 #TODO: throw a warning to the frontend, saying that maybe the message has not been sent and to contact dev of this plugin
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
227 #debug(_('HTML answer: %s') % answer)
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
228 if recipient_list:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
229 recipient = recipient_list.pop()
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
230 try:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
231 friend_id = data['friends'][recipient]['id']
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
232 except KeyError:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
233 error('INTERNAL ERROR: unknown friend')
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
234 return #send an error to the frontend
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
235 mess = message.replace('%name%',recipient).replace('%firstname%',recipient.split(' ')[0])
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
236 info(_('Sending message to %s') % recipient)
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
237 debug(_("\nsubject: %(subject)s\nmessage: \n---\n%(message)s\n---\n\n") % {'subject':subject,'message':mess})
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
238 post_data = urllib.urlencode({'email[subject]':subject.encode('utf-8'),'email[body]':mess.encode('utf-8'),'email[id]':friend_id,'email[action]':'Send Message','email[replied_id]':'','email[couchsurf]':'','email[directions_to_add]':''})
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
239 d = getPage("http://www.couchsurfing.org/send_message.html", method='POST', postdata=post_data, headers={'Content-Type':'application/x-www-form-urlencoded'} , agent=AGENT, cookies=data['cookies'])
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
240 d.addCallback(self.__sendMessage, subject, message, data, recipient_list, id, profile)
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
241 d.addErrback(self.erroCB, id)
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
242 else:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
243 interface = XMLUI('window', title=_('Message sent')) #TODO: create particular actionResult for alerts ?
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
244 interface.addText(_('The message has been sent to every recipients'))
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
245 self.host.bridge.actionResult("XMLUI", id, {"type":"window", "xml":interface.toXml()})
102
94011f553cd0 misc bugfixes
Goffi <goffi@goffi.org>
parents: 101
diff changeset
246
107
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
247 def sendMessage(self, id, data, profile):
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
248 """Called to send a message to a friend
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
249 @param data: dict with the following keys:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
250 friend: name of the recipient
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
251 subject: subject of the message
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
252 message: body of the message, with the following special keywords:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
253 - %name%: name of the friend
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
254 - %firstname%: guessed first name of the friend (currently the first part of the name)
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
255 """
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
256 if not data['friends']:
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
257 message_data={"reason": "bad data", "message":_(u"There is not recipient selected for this message !")}
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
258 self.host.bridge.actionResult("ERROR", id, message_data)
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
259 return
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
260 friends = data['friends'].split('\t')
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
261 subject = data['subject']
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
262 message = data['message']
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
263 print "send message \o/ :) :) :)"
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
264 info(_("sending message to %(friends)s with subject [%(subject)s]" % {'friends':friends, 'subject':subject}))
5ae370c71803 CS: message sending is now working
Goffi <goffi@goffi.org>
parents: 106
diff changeset
265 self.__sendMessage(None, subject, message, self.data[profile], friends, id, profile)
108
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
266
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
267 def __showUnreadMessages2(self, html, id, profile):
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
268 """Called when the inbox page has been received"""
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
269 #FIXME: that's really too fragile, only works if the unread messages are in the first page, and it would be too resources consuming for the website to DL each time all pages. In addition, the show attribute doesn't work as expected.
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
270 soup = BeautifulSoup(html)
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
271 for tag in soup.findAll(lambda tag: tag.name=='strong' and tag.a and tag.a['href'].startswith('messages.html?message_status=inbox')):
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
272 link = "http://www.couchsurfing.org/"+str(tag.a['href'])
109
18b0cf49a6f1 Plugin CS minor changes (Events & Couch Search tabs temporarly removed, open_new_tab user to open link in browser)
Goffi <goffi@goffi.org>
parents: 108
diff changeset
273 webbrowser.open_new_tab(link) #TODO: the web browser need to already have CS cookies (i.e. already be opened & logged on CS, or be permanently loggued), a warning to the user should be sent/or a balloon-tip
108
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
274
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
275 def showUnreadMessages(self, id, data, profile):
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
276 """Called when user want to see all unread messages in the external browser"""
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
277 d = getPage("http://www.couchsurfing.org/messages.html?message_status=inbox&show=10000", agent=AGENT, cookies=self.data[profile]['cookies'])
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
278 d.addCallback(self.__showUnreadMessages2, id, profile)
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
279 d.addErrback(self.erroCB, id)
e24e080e6b16 CS plugin: unread messages can now be openned in external web browser
Goffi <goffi@goffi.org>
parents: 107
diff changeset
280