source: perl/modules/Jabber/lib/BarnOwl/Message/Jabber.pm @ 8278543

release-1.7release-1.8release-1.9
Last change on this file since 8278543 was 8278543, checked in by Anders Kaseorg <andersk@mit.edu>, 11 years ago
Jabber: Make smartnarrow -i filter on subject. Signed-off-by: Anders Kaseorg <andersk@mit.edu> Reviewed-by: Nelson Elhage <nelhage@mit.edu>
  • Property mode set to 100644
File size: 3.8 KB
Line 
1use warnings;
2use strict;
3
4=head1 NAME
5
6BarnOwl::Message::Jabber
7
8=head1 DESCRIPTION
9
10A subclass of BarnOwl::Message for Jabber messages
11
12=cut
13
14package BarnOwl::Message::Jabber;
15
16use base qw( BarnOwl::Message );
17
18sub jtype { shift->{jtype} };
19sub from { shift->{from} };
20sub to { shift->{to} };
21sub room { shift->{room} };
22sub subject { shift->{subject} };
23sub status { shift->{status} }
24
25sub login_type {
26    my $self = shift;
27    my $type = $self->jtype;
28    return " ($type)" if $type;
29}
30
31sub login_extra {
32    my $self = shift;
33    my $show = $self->{show};
34    my $status = $self->status;
35    my $s = "";
36    $s .= $show if $show;
37    $s .= ", $status" if $status;
38    return $s;
39}
40
41sub long_sender {
42    my $self = shift;
43    return $self->from;
44}
45
46sub context {
47    return shift->room;
48}
49
50sub subcontext {
51    return shift->subject || "";
52}
53
54sub personal_context {
55    my $self = shift;
56    if ($self->is_incoming) {
57        return "to " . $self->to;
58    } else {
59        return "from " . $self->from;
60    }
61}
62
63sub smartfilter {
64    my $self = shift;
65    my $inst = shift;
66
67    my $filter;
68
69    if($self->jtype eq 'chat') {
70        my $user;
71        if($self->direction eq 'in') {
72            $user = $self->from;
73        } else {
74            $user = $self->to;
75        }
76        return smartfilter_user($user, $inst);
77    } elsif ($self->jtype eq 'groupchat') {
78        my $room = $self->room;
79        if ($inst) {
80            my $subject = $self->subject;
81            $filter = "jabber-room-$room-subject-$subject";
82            BarnOwl::command(qw[filter], $filter,
83                             qw[type ^jabber$ and room], "^\Q$room\E\$",
84                             qw[and subject], "^\Q$subject\E\$");
85        } else {
86            $filter = "jabber-room-$room";
87            BarnOwl::command(qw[filter], $filter,
88                             qw[type ^jabber$ and room], "^\Q$room\E\$");
89        }
90        return $filter;
91    } elsif ($self->login ne 'none') {
92        return smartfilter_user($self->from, $inst);
93    }
94}
95
96sub smartfilter_user {
97    my $user = shift;
98    my $inst = shift;
99
100    $user   = Net::Jabber::JID->new($user)->GetJID( $inst ? 'full' : 'base' );
101    my $filter = "jabber-user-$user";
102    BarnOwl::command(qw[filter], $filter, qw[type ^jabber$],
103                     qw[and ( ( direction ^in$ and from], "^\Q$user\E(/.*)?\$",
104                     qw[) or ( direction ^out$ and to ], "^\Q$user\E(/.*)?\$",
105                     qw[ ) ) ]);
106    return $filter;
107
108}
109
110sub replycmd {
111    my $self = shift;
112    my ($recip, $account, $subject);
113    if ($self->is_loginout) {
114        $recip   = $self->sender;
115        $account = $self->recipient;
116    } elsif ($self->jtype eq 'chat') {
117        return $self->replysendercmd;
118    } elsif ($self->jtype eq 'groupchat') {
119        $recip = $self->room;
120        if ($self->is_incoming) {
121            $account = $self->to;
122        } else {
123            $account = $self->from;
124        }
125        $subject = $self->subject;
126    } else {
127        # Unknown type
128        return;
129    }
130    return jwrite_cmd($recip, $account, $subject);
131}
132
133sub replysendercmd {
134    my $self = shift;
135    if($self->jtype eq 'groupchat'
136       || $self->jtype eq 'chat') {
137        my ($recip, $account);
138        if ($self->is_incoming) {
139            $recip   = $self->from;
140            $account = $self->to;
141        } else {
142            $recip   = $self->to;
143            $account = $self->from;
144        }
145        return jwrite_cmd($recip, $account);
146    }
147    return $self->replycmd;
148}
149
150sub jwrite_cmd {
151    my ($recip, $account, $subject) = @_;
152    if (defined $recip) {
153        my @cmd = ('jwrite', $recip, '-a', $account);
154        if (defined $subject) {
155            push @cmd, '-s', $subject;
156        }
157        return BarnOwl::quote(@cmd);
158    } else {
159        return undef;
160    }
161}
162
163=head1 SEE ALSO
164
165L<BarnOwl::Message>
166
167=cut
168
1691;
Note: See TracBrowser for help on using the repository browser.