Difference between revisions of "Sonovapeer.pl"

From Organic Design wiki
m
Line 144: Line 144:
 
}
 
}
 
</perl>
 
</perl>
[[Category:Peerd]]
+
[[Category:Peerd]][[Category:PERL]]

Revision as of 12:47, 8 December 2011

Legacy.svg Legacy: This article describes a concept that has been superseded in the course of ongoing development on the Organic Design wiki. Please do not develop this any further or base work on this concept, now this page is for historic record only.

<perl>

  1. !/usr/bin/perl

use strict; use POSIX qw(strftime); use Net::POP3; use HTTP::Request; use LWP::UserAgent; use Sys::Hostname;

  1. Globals

our $client = LWP::UserAgent->new( cookie_jar => {} ); our %pops = ( 'pop.mail.yahoo.com.au' => ['punk1729','peer.pl'], 'mail.div0.com' => ['talkpage+div0.com','42'] ); our %wikis = ( 'organicdesign.co.nz' => ['OrganicDesign','http://www.organicdesign.co.nz/wiki/index.php','Sonovapeer','peer.pl'], 'div0.com' => ['Div0','http://www.organicdesign.co.nz/wiki/index.php','Sonovapeer','peer.pl'] ); our %queue = (); # hash of list of list (domain/messages/fields) our $peer = hostname; # Peer represents the host, so takes hostname.langext/role/instance/child... $peer .= '.pl';

  1. TODO
  2. get pop3-tasks and wiki-sync aspects running quanta-stylez from snipits
  3. that way they migrate to the nodal model much easier
  1. Set up output logging

sub logAdd { my $entry = shift; if ( open LOG, '>>', "$peer.log" ) { print LOG localtime()." : $entry\n"; print localtime()." : $entry\n"; close LOG; } }

  1. Read in and execute a snipit

sub declare { my $snipit = shift; if ( open FH, '<', $snipit ) { binmode FH; sysread FH, my $code, 1000000; close FH; eval $code; logAdd $@ if $@; } else { logAdd "Couldn't declare $snipit!" } }

  1. Import wiki integration functions

declare 'wiki.pl';


  1. -------------------------------------------------------------------------------------------------------------#
  2. INPUT PHASE
  1. should be some kind of class loop here
  1. Loop through all POP boxes (all items in this class)

while ( my($server, $info) = each %pops ) {

# Login in to this POP box logAdd "$peer is retrieving messages from $server"; my $pop = Net::POP3->new( $server ); logAdd "Could not log in to $server!" unless $pop->login( @$info );

# Loop through all messages my $list = $pop->list(); for my $id (keys %$list) {

# Get relevent message headers and content my $msg = $pop->top($id, 1000);

# From (my $from) = grep /^from:/i, @$msg; $from =~ s/^.+?<(.+)>.*/$1/s;

# To (my $to) = grep /^to:/i, @$msg; $to =~ m/^.+?<(.+)@(.+)>.*/s; $to = $1.'@'.$2;

# Page my ($page, $domain) = ($1,$2); $page =~ s/&&/&/g; $page =~ s/&(..)/pack("c", hex($1))/eg; $page =~ s/([^\w\-\.\@])/$1 eq "\n" ? "\n" : sprintf( "%%%2.2x", ord($1) )/eg;

# Subject (my $subject) = grep /^subject:/i, @$msg; $subject =~ s/^.+?:\s*(.*)(\r?\n)*/$1/;

# Delete message and queue by domain logAdd "Message removed and task queued for $domain"; #$pop->delete($id); $msg = join , @$msg; $msg =~ s/^.+\r?\n\r?\n//sm; $msg =~ s/\s+$//sm; push @{$queue{$domain}}, [$from, $to, $subject, $page, $msg]; }

# Logout of this POP $pop->quit(); }


  1. -------------------------------------------------------------------------------------------------------------#
  2. OUTPUT PHASE

while ( my ($domain, $tasks) = each %queue ) {

if ( exists $wikis{$domain} ) {

# Log in to associated wiki my ($name, $wiki, $user, $pass) = @{$wikis{$domain}}; wikiLogin( $wiki, $user, $pass );

# Loop through all the tasks queued for this wiki for my $task ( @$tasks ) {

my ($from, $to, $subject, $page, $msg) = @$task;

# Get the current content of the page my $content = wikiRawPage( $wiki, $page ); $content = if $content eq '(There is currently no text in this page)'; $content = "----\n$content";

# Prepend the new message and sign $subject = "(Email edit by $from) $subject"; my $ts = strftime "%H:%M, %e %b %Y (NZDT)", localtime; $content = "$msg\n:$from $ts\n$content";

# Write the new content back to the wiki wikiPageEdit( $wiki, $page, $content, $subject ); }

# Log out of wiki wikiLogout( $wiki ); }

else { logAdd "No rules for $domain" } } </perl>