Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/gnome_plugins/fb_plugin.py
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2013-01-30 21:50:58 (GMT)
committer Walter Bender <walter.bender@gmail.com>2013-01-30 21:50:58 (GMT)
commit687ebda03c7d7d34df418dd3a077e3eb33b1678d (patch)
tree9d9393f507bc50410384badd0c35b3ee08fff1d3 /gnome_plugins/fb_plugin.py
parentbee4962bfba81d2cfc25126714f30a5322e0d5de (diff)
add fb plugin; consolidate gnome menus when possible
Diffstat (limited to 'gnome_plugins/fb_plugin.py')
-rw-r--r--gnome_plugins/fb_plugin.py137
1 files changed, 137 insertions, 0 deletions
diff --git a/gnome_plugins/fb_plugin.py b/gnome_plugins/fb_plugin.py
new file mode 100644
index 0000000..d7b49ff
--- /dev/null
+++ b/gnome_plugins/fb_plugin.py
@@ -0,0 +1,137 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2012 Raul Gutierrez S. - rgs@itevenworks.net
+# Copyright (c) 2013 Alan Aguiar alanjas@hotmail.com
+
+#Permission is hereby granted, free of charge, to any person obtaining a copy
+#of this software and associated documentation files (the "Software"), to deal
+#in the Software without restriction, including without limitation the rights
+#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+#copies of the Software, and to permit persons to whom the Software is
+#furnished to do so, subject to the following conditions:
+
+#The above copyright notice and this permission notice shall be included in
+#all copies or substantial portions of the Software.
+
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+#THE SOFTWARE.
+
+# NOTE: This is a plugin to enable uploading of Turtle Art projects to
+# Facebook. It currently works for the GTK3 version of Turtle Blocks and
+# only from the GNOME desktop.
+# USAGE: Download this file into the gnome_plugin directory; make sure the
+# filename is fb_plugin.py (Mediawiki capitalizes the first letter of files).
+# When you launch TA from the GNOME desktop by running turtleblocks.py
+# you should see a new menu, Facebook, which allows you to upload your
+# project. Please report any problems to rgs and walter.
+
+
+import pycurl
+import sys
+import urlparse
+
+import gtk
+import webkit
+from plugin import Plugin
+from util.menubuilder import MenuBuilder, MENUBAR
+from gettext import gettext as _
+
+class FbUploader():
+ UPLOAD_URL = "https://graph.facebook.com/me/photos?access_token=%s"
+
+ def __init__(self, image_path, access_token):
+ self._image_path = image_path
+ self._access_token = access_token
+
+ def doit(self):
+ c = pycurl.Curl()
+ c.setopt(c.POST, 1)
+ c.setopt(c.URL, self._get_url())
+ c.setopt(c.HTTPPOST, self._get_params(c))
+ c.perform()
+ print c.getinfo(c.HTTP_CODE)
+
+ def _get_url(self):
+ return self.UPLOAD_URL % (self._access_token)
+
+ def _get_params(self, c):
+ params = []
+ params.append(('source', (c.FORM_FILE, self._image_path)))
+
+ return params
+
+
+class Fb_plugin(Plugin):
+ APP_ID = "172917389475707"
+ REDIRECT_URI = "http://www.sugarlabs.org"
+
+ def __init__(self, parent):
+ self._access_token = ""
+ self._auth_win = None
+
+ def get_menu(self):
+ if _('Upload') in MENUBAR:
+ menu, upload_menu = MENUBAR[_('Upload')]
+ else:
+ upload_menu = None
+ menu = gtk.Menu()
+ MenuBuilder.make_menu_item(menu, _('Facebook wall post'),
+ self._post_menu_cb)
+ if upload_menu is not None:
+ return None # We don't have to add it since it already exists
+ else:
+ upload_menu = MenuBuilder.make_sub_menu(menu, _('Upload'))
+ return upload_menu
+
+ def set_tw(self, turtleart_window):
+ self.tw = turtleart_window
+
+ def enabled(self):
+ return True
+
+ def _post_menu_cb(self, widget):
+ if self._access_token == "":
+ self._grab_fb_app_token()
+ return
+
+ self._post_to_fb()
+
+ def _grab_fb_app_token(self):
+ url = self._get_auth_url()
+ w = gtk.Window()
+ w.move(200, 200)
+ w.set_size_request(800, 400)
+ wkv = webkit.WebView()
+ wkv.load_uri(url)
+ wkv.grab_focus()
+ wkv.connect('navigation-policy-decision-requested', self._nav_policy_cb)
+ w.add(wkv)
+ w.show_all()
+ self._auth_win = w
+
+ def _get_auth_url(self):
+ url = "http://www.facebook.com/dialog/oauth?client_id=%s" % (self.APP_ID)
+ url += "&redirect_uri=%s" % (self.REDIRECT_URI)
+ url += "&response_type=token&scope=publish_stream"
+
+ return url
+
+ def _nav_policy_cb(self, view, frame, req, action, param):
+ uri = req.get_uri()
+ if uri:
+ url_o = urlparse.urlparse(uri)
+ params = urlparse.parse_qs(url_o.fragment)
+ if params.has_key('access_token'):
+ self._access_token = params['access_token'][0]
+ self._auth_win.hide()
+ self._post_to_fb()
+
+ def _post_to_fb(self):
+ ta_file, image_file = self.tw.save_for_upload("ta fb")
+ uploader = FbUploader(image_file, self._access_token)
+ uploader.doit()