/usr/share/perl5/App/Nopaste/Service.pm is in libapp-nopaste-perl 0.33-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | package App::Nopaste::Service;
use strict;
use warnings;
use WWW::Mechanize;
sub available { 1 }
sub forbid_in_default { 0 }
# this wrapper is so we can canonicalize arguments, especially "lang"
sub nopaste {
my $self = shift;
$self->run(@_);
}
sub run {
my $self = shift;
my $mech = WWW::Mechanize->new;
$self->get($mech => @_);
$self->fill_form($mech => @_);
return $self->return($mech => @_);
}
sub uri {
my $class = ref($_[0]) || $_[0];
Carp::croak "$class must provide a 'uri' method.";
}
sub get {
my $self = shift;
my $mech = shift;
my $res = $mech->get($self->uri);
die "Unable to fetch ".$self->uri.": " . $res->status_line
unless $res->is_success;
return $res;
}
sub fill_form {
my $self = shift;
my $mech = shift;
my %args = @_;
$mech->form_number(1);
$args{chan} = $self->canonicalize_chan($mech, $args{chan});
$mech->submit_form(
fields => {
paste => $args{text},
do { $args{chan} ? (channel => $args{chan}) : () },
do { $args{desc} ? (summary => $args{desc}) : () },
do { $args{nick} ? (nick => $args{nick}) : () },
private => (exists $args{private} && $args{private} ? 1 : 0),
},
);
}
sub canonicalize_chan {
my $self = shift;
my $mech = shift;
my $chan = shift;
return $chan if !$chan;
my @chans = grep { length }
$mech->current_form->find_input('channel')->possible_values;
my %is_valid = map { $_ => 1 } @chans;
return $chan if $is_valid{$chan};
my $orig = $chan;
$chan =~ s/^\#//;
return $chan if $is_valid{$chan};
$chan = "#$chan";
return $chan if $is_valid{$chan};
warn "Invalid channel '$orig'. Valid values are: " . join(', ', @chans);
return $orig;
}
sub return {
my $self = shift;
my $mech = shift;
my $link = $mech->find_link(url_regex => qr{/?(?:\d+)$});
return (0, "Could not find paste link.") if !$link;
return (1, $link->url);
}
=head1 NAME
App::Nopaste::Service - base class for nopaste services
=head1 SYNOPSIS
package App::Nopaste::Service::Shadowcat;
use base 'App::Nopaste::Service';
sub uri { "http://paste.scsys.co.uk/" }
=head1 DESCRIPTION
C<App::Nopaste::Service> defines a generic interface for uploading to nopaste
sites. It provides a default interface to that of the POE Pastebot.
=head1 METHODS
=head2 nopaste
This is the outermost method called by L<App::Nopaste> and other clients. You
should not override this method, as it will (XXX: eventually) perform
canonicalization of arguments (such as C<lang>) for you.
=head2 run args -> (OK, message)
This is the outermost method you should override. You'll be passed a hash of arguments. The only arguments you should pay attention to are:
=over 4
=item text
The body of text to paste.
=item desc
A short (one-line) summary of the paste.
=item nick
The name of the person performing the paste.
=item chan
The IRC channel to which the paste belongs.
=item lang
The programming language of the body of text.
=item private
If false, the paste will be public (default).
=back
=head2 get mech, args
This should "get" the form to paste using the provided L<WWW::Mechanize>
object. By default it does just that. See L</uri> below.
=head2 uri
If you only need to call C<< mech->get(uri) >> then you may define this method
to provide the URI of the nopaste service.
=head2 fill_form mech, args
This should have the L<WWW::Mechanize> fill in the form using the arguments,
and submit it.
=head2 return mech, args
This should look at C<< WWW::Mechanize->content >> to find the URI to the
pasted text.
=head1 AUTHOR
Shawn M Moore, C<< <sartak at gmail.com> >>
=cut
1;
|