cli) { die("access denied"); } HTML_FlexyFramework::ensureSingle(__FILE__, $this); return true; } function get() { //DB_DataObject::debugLevel(1); date_default_timezone_set('UTC'); // what's the baserul.. $MAX_DIFF = 200 * 1024; $USE_BATCHING = false; $e= DB_DataObject::factory('Events'); $e->action = 'MTRACK.NOTIFY'; $e->selectAdd(); $e->selectAdd('MAX(event_when) as event_when'); $e->find(true); if (empty($e->event_when)) { $e->event_when = date('Y-m-d H:i:s', strtotime("NOW - 2 days")); // should be a long time ago.. } //stream_filter_register("mtrackcanonical", 'CanonicalLineEndingFilter'); //stream_filter_register("mtrackunix", 'UnixLineEndingFilter'); $w = DB_DataObject::factory('core_watch'); //echo "gather watched"; // DB_DataObject::debugLevel(1); // returns a list of user with the objects they are watching.. $watches = $w->watched('email'); //echo "\nDONE WATCHED\n"; $CS = DB_DataObject::factory('mtrack_change'); $messages = array(); $cache = array(); foreach($watches as $uid => $ar) { //echo "gather changes"; //print_r($uid); print_r($ar); // we can now query mtrack_change for anything that occured in that list.. $messages = $CS->gatherChanges($e->event_when, $uid, $ar); //print_R($messages);exit; // we should cache the emails. = as multiple people might be getting the same email. // should be like a list of tickets foreach ($messages as $m=>$ar) { $lr = explode(':', $m); $o = DB_DataObject::Factory($lr[0]); $o->autoJoin(); $o->get($lr[1]); if (!isset($cache[implode(',', $ar)])) { $cs = clone($CS); $cs->whereAddIn('mtrack_change.id', $ar, 'int'); $cs->autoJoin(); $cache[implode(',', $ar)] = $cs->fetchAll(); } $u = DB_DataObject::factory('core_person'); $u->get($uid); $method = 'notify_'. $lr[0] ; if (method_exists($this,$method)) { $this->$method($o, $cache[implode(',', $ar)], $u); } } } // print_R($messages); die("done"); /* For each watcher, compute the changes. * Group changes by ticket, sending one email per ticket. * Group tickets into batch updates if the only fields that changed are * bulk update style (milestone, assignment etc.) * * For the wiki repo, group by file so that serial edits within the batch * period show up as a single email. */ } /** * sets: * - from (system or a specific user.) * - replyto (system) * - to user... * */ function calcAddress($ticket, $changes, $user) { $ff = HTML_FlexyFramework::get(); $changers = array(); foreach($changes as $c) { if ($change->person_id == $user->id) { continue; } if (in_array($change->person_id_name, $changers)) { continue; } $changers[] = $change->person_id_name; } $fromname = '"'. addslashes($project->toEventString()). '"'; if (count($changers) == 1) { $fromname = '"'. addslashes($changers[0]). '"'; } $p = $ticket->project(); $headers['To'] = '"'. addslashes($user->name). '" <' . $user->email .'>'; $headers['From'] = '"'. addslashes($project->toEventString()). '" '. $ff->MTrackWeb['email_address']; // could be the user who made the change... //if (count($from) > 1) { // $rep = array(); // array_shift($from); // foreach ($from as $email) { // $rep[] = make_email($email[0], $email[1]); // } $headers['Reply-To'] = $ff->MTrackWeb['email_address']; //} return $headers; } /** * convert notification into an email.. * * @param object $ticket the DataObject * @param array $items the ids of the mtrack_change's * @parem object $user DataObject of the user.. * */ function notify_mtrack_ticket($ticket, $changes, $user) { //global $MAX_DIFF; $ff = HTML_FlexyFramework::get(); // from is always the system.. ?? // unless all the changers are the same.. $headers = $this->calcAddress($ticket, $changes, $user); //$headers['To'] = '"'. addslashes($user->name). '" <' . $user->email .'>'; //$headers['From'] = make_email($from[0][0], $from[0][1]); //if (count($from) > 1) { // $rep = array(); // array_shift($from); // foreach ($from as $email) { // $rep[] = make_email($email[0], $email[1]); // } //$headers['Reply-To'] = join(', ', $rep); //} $headers += array( 'MIME-Version' => '1.0', 'Content-Type' => 'text/plain; charset="UTF-8"', 'Content-Transfer-Encoding' => 'quoted-printable', ); $mid = $ticket->id . '@' . php_uname('n'); //if ($is_initial) { // $headers['Message-ID'] = "<$mid>"; //} else { //$headers['Message-ID'] = "<$T->updated.$mid>"; //$headers['In-Reply-To'] = "<$mid>"; //$headers['References'] = "<$mid>"; //} /* find related project(s) */ $p = $ticket->project(); $subj = "[" . $p->code . ' - ' . $p->name . "] "; $headers['X-mtrack-project-list'] = $p->code; //foreach ($projects as $pname) { // $headers["X-mtrack-project-$pname"] = $pname; // $headers['X-mtrack-project'][] = $pname; //} //} else { //$subj = ''; // } $headers['Subject'] = sprintf("%s#%s %s (%s %s)", $subj, $ticket->id, $ticket->summary, $ticket->status_name, $ticket->classification_id_name); $owner = $ticket->owner_id ? $ticket->owner_id_name : 'nobody'; $body = sprintf("%s/Ticket.php/%s\n\n", $ff->MTrackWeb['url'], $ticket->id) . sprintf("#%s: %s (%s %s)\n", $ticket->id, $ticket->summary, $ticket->status_name, $ticket->classification_id_name) . sprintf("Responsible: %s (%s / %s)\n", $owner, $ticket->priority_id_name, $ticket->severity_id_name) . //sprintf("Milestone: %s\n", join(', ', $T->getMilestones())); //sprintf("Component: %s\n", join(', ', $T->getComponents())); "\n"; // Display changed fields grouped by the person that last changed them //$who_changed = array(); //foreach ($field_changers as $field => $who) { // $who_changed[$who][] = $field; //} $body.="\n\n"; foreach ($changes as $change) { $body .= "{$change->changedate}: Change by {$change->person_id_name}\n"; $body .= str_repeat('-', 80) . "\n"; if (!empty($change->reason)) { $body.= $change->reason; } $ar = $change->cachedAudit(); foreach($ar as $audit) { switch($audit->field()) { case 'id': continue; //??? ignore? case '@components': continue; // $old = array(); // foreach (preg_split("/\s*,\s*/", $old_values[$field]) as $id) { /* if (!strlen($id)) continue; $c = get_component($id); $old[$id] = $c->name; } $value = $T->getComponents(); $field = 'Component'; break; */ case '@milestones': continue; // $old = array(); // foreach (preg_split("/\s*,\s*/", $old_values[$field]) as $id) { /* if (!strlen($id)) continue; $m = get_milestone($id); $old[$id] = $m->name; } $value = array(); $value = $T->getMilestones(); $field = 'Milestone'; break; */ case '@keywords': continue; /* $old = array(); $field = 'Keywords'; $value = $T->getKeywords(); break; */ //case 'commit?' default: $oldvalue = $audit->oldvalue($this); $value = $audit->oldvalue($this); if (!strlen($oldvalue)) { $body .= "Set {$audit->field()} to: {$value}\n"; continue; } if (!strlen($value)) { $body .= "Removed {$audit->field()} - was: {$oldvalue}\n"; continue; } $body .= "Changed {$audit->field()} from :{$oldvalue} -> {$value}\n"; continue; } } } $body .= sprintf("%s/Ticket.php/%s\n\n", $ff->MTrackWeb['url'], $ticket->id); echo $body; // send_mail($udata['email'], $plain); } } /* class CanonicalLineEndingFilter extends php_user_filter { function filter($in, $out, &$consumed, $closing) { while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = preg_replace("/\r?\n/", "\r\n", $bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } } class UnixLineEndingFilter extends php_user_filter { function filter($in, $out, &$consumed, $closing) { while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = preg_replace("/\r?\n/", "\n", $bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } } */