<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[2254] 2013/merty: Did some clean up.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://gsoc.trac.wordpress.org/changeset/2254">2254</a></dd>
<dt>Author</dt> <dd>merty</dd>
<dt>Date</dt> <dd>2013-09-03 21:14:26 +0000 (Tue, 03 Sep 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Did some clean up. Added documentation.</pre>

<h3>Added Paths</h3>
<ul>
<li>2013/merty/docs/</li>
<li><a href="#2013mertydocsindexhtml">2013/merty/docs/index.html</a></li>
<li><a href="#2013mertydocslogopng">2013/merty/docs/logo.png</a></li>
<li><a href="#2013mertydocsstylecss">2013/merty/docs/style.css</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#2013mertytracpluginsActivityStreamRepositoryNotifierpy">2013/merty/trac/plugins/ActivityStreamRepositoryNotifier.py</a></li>
<li><a href="#2013mertywpwpactivitylistenerphp">2013/merty/wp/wp-activity-listener.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="2013mertydocsindexhtml"></a>
<div class="addfile"><h4>Added: 2013/merty/docs/index.html (0 => 2254)</h4>
<pre class="diff"><span>
<span class="info">--- 2013/merty/docs/index.html                               (rev 0)
+++ 2013/merty/docs/index.html  2013-09-03 21:14:26 UTC (rev 2254)
</span><span class="lines">@@ -0,0 +1,114 @@
</span><ins>+<html>
+<head>
+       <title>Profiles.WordPress.org Documentation</title>
+       <link href="style.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+       <h1 class="logo"><img src="logo.png" title="WordPress" /></h1>
+       <p>This documentation is written to briefly explain the plugins that send the user activity data to the BuddyPress installation that powers profiles.wordpress.org.</p>
+       <h3>Contents</h3>
+               <ul>
+                       <li><a href="#bbpress" title="bbPress Plugins">bbPress Plugins</a></li>
+                       <li><a href="#trac" title="Trac Plugin">Trac Plugin</a></li>
+                       <li><a href="#buddypress" title="BuddyPress Plugin">BuddyPress Plugin</a></li>
+               </ul>
+       <h2 id="bbpress">bbPress Plugins</h2>
+       <p>There are 3 plugins for bbPress at the time of writing this document:</p>
+       <ol>
+               <li>New Plugin Notifier</li>
+               <li>New Post Notifier</li>
+               <li>New Theme Notifier</li>
+       </ol>
+       <h3>New Plugin Notifier:</h3>
+       <p>This plugin should be installed on the bbPress installation that powers the WordPress Plugin Directory.</p>
+       <p>The plugin sends a request to the BuddyPress installation when the following criteria are met:</p>
+       <ul>
+               <li>A new topic is created in the forum which has the ID of 1</li>
+               <li>The status of the topic is set to 0</li>
+               <li>The topic is open</li>
+       </ul>
+       <p>The data it sends to BuddyPress contains the following:</p>
+       <ul>
+               <li><strong>action:</strong> <code>dotorg_handle_activity</code></li>
+               <li><strong>source:</strong> <code>plugin</code></li>
+               <li><strong>user:</strong> <code>#TOPIC_OWNER_USER_ID#</code></li>
+               <li><strong>title:</strong> <code>#TOPIC_TITLE#</code></li>
+               <li><strong>url:</strong> <code>http://wordpress.org/plugins/#TOPIC_SLUG#/</code></li>
+       </ul>
+       <h3>New Post Notifier:</h3>
+       <p>This plugin should be installed on the bbPress installation that powers the WordPress Support Forums.</p>
+       <p>The plugin sends a request to the BuddyPress installation whenever a new topic/post is created.</p>
+       <p>The data it sends to BuddyPress contains the following:</p>
+       <ul>
+               <li><strong>action:</strong> <code>dotorg_handle_activity</code></li>
+               <li><strong>source:</strong> <code>bbpress</code></li>
+               <li><strong>user:</strong> <code>#TOPIC_OWNER_USER_ID#</code></li>
+               <li><strong>topic:</strong> <code>#TOPIC_ID#</code></li>
+               <li><strong>title:</strong> <code>#TOPIC_TITLE#</code></li>
+               <li><strong>url:</strong> <code>#TOPIC_URL#</code></li>
+               <li><strong>message:</strong> <code>#POST_TEXT#</code></li>
+               <li><strong>newTopic:</strong> <code>#IS_FIRST_POST#</code></li>
+       </ul>
+       <h3>New Theme Notifier:</h3>
+       <p>This plugin should be installed on the bbPress installation that powers the WordPress Theme Directory.</p>
+       <p>The plugin sends a request to the BuddyPress installation when the following criteria are met:</p>
+       <ul>
+               <li>A new topic is created</li>
+               <li>The status of the topic is set to 0</li>
+       </ul>
+       <p>The data it sends to BuddyPress contains the following:</p>
+       <ul>
+               <li><strong>action:</strong> <code>dotorg_handle_activity</code></li>
+               <li><strong>source:</strong> <code>theme</code></li>
+               <li><strong>user:</strong> <code>#TOPIC_OWNER_USER_ID#</code></li>
+               <li><strong>title:</strong> <code>#TOPIC_TITLE#</code></li>
+               <li><strong>url:</strong> <code>http://wordpress.org/themes/#TOPIC_SLUG#/</code></li>
+       </ul>
+       <h2 id="trac">Trac Plugin</h2>
+       <p>There is a single Trac plugin that needs to be installed on every Trac installation in the dot org ecosystem. It does not need to be customized for each Trac installation as it automatically fetches the name of the Trac from Trac's environment variables.</p>
+       <p>It currently listens to 3 changes:</p>
+       <ol>
+               <li>New Ticket</li>
+               <li>New Comment</li>
+               <li>New Commit</li>
+       </ol>
+       <h3>New Ticket</h3>
+       <p>The plugin sends a request to the BuddyPress installation when a new ticket is created.</p>
+       <p>The data it sends to BuddyPress contains the following:</p>
+       <ul>
+               <li><strong>action:</strong> <code>dotorg_handle_activity</code></li>
+               <li><strong>source:</strong> <code>trac</code></li>
+               <li><strong>trac:</strong> <code>#TRAC_PROJECT_NAME#</code></li>
+               <li><strong>user:</strong> <code>#TICKET_REPORTER#</code></li>
+               <li><strong>id:</strong> <code>#TICKET_ID#</code></li>
+               <li><strong>title:</strong> <code>#TICKET_TITLE#</code></li>
+               <li><strong>description:</strong> <code>#TICKET_DESCRIPTION#</code></li>
+       </ul>
+       <h3>New Comment</h3>
+       <p>The plugin sends a request to the BuddyPress installation when a new comment is added to a ticket.</p>
+       <p>The data it sends to BuddyPress contains the following:</p>
+       <ul>
+               <li><strong>action:</strong> <code>dotorg_handle_activity</code></li>
+               <li><strong>source:</strong> <code>trac</code></li>
+               <li><strong>trac:</strong> <code>#TRAC_PROJECT_NAME#</code></li>
+               <li><strong>user:</strong> <code>#COMMENT_AUTHOR#</code></li>
+               <li><strong>id:</strong> <code>#TICKET_ID#</code></li>
+               <li><strong>title:</strong> <code>#TICKET_TITLE#</code></li>
+               <li><strong>comment:</strong> <code>#COMMENT_TEXT#</code></li>
+       </ul>
+       <h3>New Commit</h3>
+       <p>The plugin sends a request to the BuddyPress installation when a new commit is made.</p>
+       <p>The data it sends to BuddyPress contains the following:</p>
+       <ul>
+               <li><strong>action:</strong> <code>dotorg_handle_activity</code></li>
+               <li><strong>source:</strong> <code>trac</code></li>
+               <li><strong>trac:</strong> <code>#TRAC_PROJECT_NAME#</code></li>
+               <li><strong>changeset:</strong> <code>#REVISION_NUMBER#</code></li>
+               <li><strong>message:</strong> <code>#COMMIT_MESSAGE#</code></li>
+       </ul>
+       <h2 id="buddypress">BuddyPress Plugin</h2>
+       <p>This is a WordPress plugin that handles the requests from bbPress and Trac installations, and can be placed inside the mu-plugins directory as it does not need any configuration. Simply, it binds to wp_ajax_nopriv_dotorg_handle_activity and processes the AJAX requests it receives.</p>
+       <p>First, it checks whether the request is valid or not (security check) and if it's valid, it proceeds to deciding how it should handle the request as it depends on the source of the request (trac, bbpress, plugin, theme). Once that decision is made, plugin finds the subject user and appropriately creates a new activity for that user. The activity is listed immediately on the user's profile page.</p>
+       <p class="credits"><small>Project sponsored by <a href="http://code.google.com/soc/" title="Google Summer of Code">Google</a>, developed by <a href="http://twitter.com/_mert" title="Mert Yazicioglu">Mert Yazicioglu</a> and mentored by <a href="http://twitter.com/boone" title="Boone B. Gorges">Boone B. Gorges</a> and <a href="http://twitter.com/coffee2code" title="Scott Reilly">Scott Reilly</a>.</small></p>
+</body>
+</html>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="2013mertydocslogopng"></a>
<div class="binary"><h4>Added: 2013/merty/docs/logo.png</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Index: 2013/merty/docs/logo.png
</span><span class="cx">===================================================================
</span><del>--- 2013/merty/docs/logo.png    2013-09-03 19:19:31 UTC (rev 2253)
</del><ins>+++ 2013/merty/docs/logo.png     2013-09-03 21:14:26 UTC (rev 2254)
</ins><span class="cx">Property changes on: 2013/merty/docs/logo.png
</span><span class="cx">___________________________________________________________________
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+application/octet-stream
</ins><span class="cx">\ No newline at end of property
</span><a id="2013mertydocsstylecss"></a>
<div class="addfile"><h4>Added: 2013/merty/docs/style.css (0 => 2254)</h4>
<pre class="diff"><span>
<span class="info">--- 2013/merty/docs/style.css                                (rev 0)
+++ 2013/merty/docs/style.css   2013-09-03 21:14:26 UTC (rev 2254)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+html {
+       background-color: #f9f9f9;
+}
+
+body {
+       background-color: #ffffff;
+       border: 1px solid #dfdfdf;
+       border-radius: 11px;
+       font-family: sans-serif;
+       margin: 2em auto;
+       padding: 1em 2em;
+       width: 700px;
+       -khtml-border-radius: 11px;
+       -moz-border-radius: 11px;
+       -webkit-border-radius: 11px;
+}
+
+a {
+       color: #21759b;
+}
+
+a:hover, a:active, a:focus {
+       color: #d54e21;
+}
+
+code {
+       background: #eaeaea;
+       font: 11px Consolas, Monaco, monospace;
+       margin: 0 1px;
+       padding: 1px 3px;
+}
+
+h1, h2, h3 {
+       border-bottom: 1px solid #dadada;
+       clear: both;
+       color: #666666;
+       font: 24px Georgia, "Times New Roman", Times, serif;
+       margin: 5px 0 0 -4px;
+       padding: 0px;
+       padding-bottom: 7px;
+}
+
+h3 {
+       font-size: 20px;
+}
+
+p, li {
+       font-size: 12px;
+       line-height: 18px;
+       padding-bottom: 2px;
+}
+
+.credits {
+       text-align: center;
+}
+
+.logo {
+       border-bottom: none;
+       margin: 6px 0 14px 0;
+       text-align: center;
+}
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="2013mertytracpluginsActivityStreamRepositoryNotifierpy"></a>
<div class="delfile"><h4>Deleted: 2013/merty/trac/plugins/ActivityStreamRepositoryNotifier.py (2253 => 2254)</h4>
<pre class="diff"><span>
<span class="info">--- 2013/merty/trac/plugins/ActivityStreamRepositoryNotifier.py      2013-09-03 19:19:31 UTC (rev 2253)
+++ 2013/merty/trac/plugins/ActivityStreamRepositoryNotifier.py 2013-09-03 21:14:26 UTC (rev 2254)
</span><span class="lines">@@ -1,31 +0,0 @@
</span><del>-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013 Mert Yazicioglu <mert@mertyazicioglu.com>
-#
-
-import urllib
-import urllib2
-
-from trac.core import *
-from trac.versioncontrol.api import IRepositoryChangeListener
-
-
-class ActivityStreamRepositoryNotifier(Component):
-    """Pushes the props to BuddyPress, which will generate an activity stream
-    item for it.
-    """
-
-    implements(IRepositoryChangeListener)
-
-    def changeset_added(self, repos, changeset):
-        url = 'http://localhost:3000/api/trac'
-        payload = urllib.urlencode(
-            {'trac': self.env.project_name,
-             'changeset': changeset.rev,
-             'message': changeset.message}
-        )
-        req = urllib2.Request(url, payload)
-        urllib2.urlopen(req)
-
-    def changeset_modified(self, repos, changeset, old_changeset):
-        pass
</del></span></pre></div>
<a id="2013mertywpwpactivitylistenerphp"></a>
<div class="delfile"><h4>Deleted: 2013/merty/wp/wp-activity-listener.php (2253 => 2254)</h4>
<pre class="diff"><span>
<span class="info">--- 2013/merty/wp/wp-activity-listener.php   2013-09-03 19:19:31 UTC (rev 2253)
+++ 2013/merty/wp/wp-activity-listener.php      2013-09-03 21:14:26 UTC (rev 2254)
</span><span class="lines">@@ -1,98 +0,0 @@
</span><del>-<?php
-
-include('./wp-load.php');
-
-if ( ! function_exists('bp_activity_add') ) exit;
-
-$source = $_GET['source'];
-
-if ( $source === 'bbpress' ) {
-    handleBBPressActivity();
-} else if ( $source === 'trac' ) {
-    handleTracActivity();
-}
-
-function handleBBPressActivity() {
-
-    $user = get_user_by('login', $_POST['user']);
-
-    if ( empty( $user ) ) exit;
-
-    if ( $_POST['newTopic'] ) {
-        $action = $user->display_name . ' created a new topic.';
-        $content = $_POST['title'];
-        $type = 'new_topic';
-    } else {
-        $action = $user->display_name . ' posted a reply to ' . $_POST['title'];
-        $content = $_POST['message'];
-        $type = 'new_post';
-    }
-
-    $args = array(
-        'user_id'           => $user->ID,
-        'action'            => $action,
-        'content'           => $content,
-        'primary_link'      => $_POST['url'],
-        'component'         => 'dotorg_activities',
-        'type'              => $type,
-        'item_id'           => $user->ID,
-        'secondary_item_id' => $_POST['topic'],
-        'hide_sitewide'     => false
-    );
-
-    bp_activity_add($args);
-}
-
-function handleTracActivity() {
-
-    if ( ! empty( $_POST['description'] ) ) {
-        $user = get_user_by('login', $_POST['user']);
-        if ( empty( $user ) ) exit;
-        $args = array(
-            'user_id'           => $user->ID,
-            'action'            => $user->display_name . ' created a new ticket in ' . $_POST['trac'],
-            'content'           => $_POST['title'],
-            'component'         => 'dotorg_activities',
-            'type'              => 'new_ticket',
-            'item_id'           => $user->ID,
-            'secondary_item_id' => $_POST['id'],
-            'hide_sitewide'     => false
-        );
-        bp_activity_add($args);
-    } else if ( ! empty( $_POST['comment'] ) ) {
-        $user = get_user_by('login', $_POST['user']);
-        if ( empty( $user ) ) exit;
-        $args = array(
-            'user_id'           => $user->ID,
-            'action'            => $user->display_name . ' posted a reply to ' . $_POST['title'],
-            'content'           => $_POST['message'],
-            'component'         => 'dotorg_activities',
-            'type'              => 'new_comment',
-            'item_id'           => $user->ID,
-            'secondary_item_id' => $_POST['id'],
-            'hide_sitewide'     => false
-        );
-        bp_activity_add($args);
-    } else {
-        preg_match('/props ([a-zA-Z0-9, ])*./', $_POST['message'], $matches);
-        $usernames = substr($matches[0], 6, -1);
-        $usernames = explode(', ', $usernames);
-        foreach ( $usernames as $username ) {
-            $user = get_user_by('login', $username);
-            if ( empty( $user ) ) continue;
-            $args = array(
-                'user_id'           => $user->ID,
-                'action'            => $user->display_name . ' has received props in ' . $_POST['trac'],
-                'content'           => $_POST['message'],
-                'component'         => 'dotorg_activities',
-                'type'              => 'new_props',
-                'item_id'           => $user->ID,
-                'secondary_item_id' => $_POST['changeset'],
-                'hide_sitewide'     => false
-            );
-            bp_activity_add($args);
-        }
-    }
-}
-
-exit;
</del><span class="cx">\ No newline at end of file
</span></span></pre>
</div>
</div>

</body>
</html>