]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Users.pm
c2a521e08ea24b38bf0971b7e70d5c2f28e95d83
[ndwebbie.git] / lib / NDWeb / Controller / Users.pm
1 package NDWeb::Controller::Users;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 use ND::Include;
8 use Mail::Sendmail;
9
10 =head1 NAME
11
12 NDWeb::Controller::Users - Catalyst Controller
13
14 =head1 DESCRIPTION
15
16 Catalyst Controller.
17
18 =head1 METHODS
19
20 =cut
21
22
23 =head2 index 
24
25 =cut
26
27 sub index :Path :Args(0) {
28         my ( $self, $c ) = @_;
29         my $dbh = $c->model;
30
31         my $query = $dbh->prepare(qq{SELECT u.uid,username,TRIM(',' FROM concat(g.groupname||',')) AS groups
32                 FROM users u LEFT OUTER JOIN (groupmembers gm NATURAL JOIN groups g) ON gm.uid = u.uid
33                 WHERE u.uid > 0
34                 GROUP BY u.uid,username
35                 ORDER BY lower(username)});
36         $query->execute;
37
38         my @users;
39         while (my $user = $query->fetchrow_hashref){
40                 push @users, $user;
41         }
42         $c->stash(users => \@users);
43 }
44
45 sub edit : Local {
46         my ( $self, $c, $user ) = @_;
47         my $dbh = $c->model;
48
49         $c->forward('findUser');
50         $user = $c->stash->{u};
51
52         my $groups = $dbh->prepare(q{SELECT g.gid,g.groupname,uid 
53                 FROM groups g 
54                 LEFT OUTER JOIN (SELECT gid,uid FROM groupmembers WHERE uid = ?)
55                         AS gm ON g.gid = gm.gid
56                 });
57         $groups->execute($user->{uid});
58
59
60         my @addgroups;
61         my @remgroups;
62         while (my $group = $groups->fetchrow_hashref){
63                 if ($group->{uid}){
64                         push @remgroups,$group;
65                 }else{
66                         push @addgroups,$group;
67                 }
68         }
69         $c->stash(membergroups => \@remgroups);
70         $c->stash(othergroups => \@addgroups);
71
72 }
73
74 sub updateUser : Local {
75         my ( $self, $c, $user ) = @_;
76         my $dbh = $c->model;
77
78         $c->forward('findUser');
79         $user = $c->stash->{u};
80
81         $dbh->begin_work;
82         eval{
83                 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
84                         (SELECT ftid FROM users WHERE uid = $1),$1,$2)
85                         });
86
87                 my $delgroup = $dbh->prepare(q{DELETE FROM groupmembers WHERE uid = ? AND gid = ?});
88                 my $addgroup = $dbh->prepare(q{INSERT INTO groupmembers (uid,gid) VALUES(?,?)});
89                 for my $param ($c->req->param()){
90                         if ($param =~ /^c:(planet|\w+_points|hostmask|info|username|email|sms)$/){
91                                 my $column = $1;
92                                 my $value = $c->req->param($column);
93                                 if ($column eq 'planet'){
94                                         $column = 'pid';
95                                         if ($value eq ''){
96                                                 $value = undef;
97                                         }elsif($value =~ /^(\d+)\D+(\d+)\D+(\d+)$/){
98                                                 ($value) = $dbh->selectrow_array(q{SELECT pid FROM
99                                                         current_planet_stats WHERE x = ? and y = ? and z =?}
100                                                         ,undef,$1,$2,$3);
101                                         }
102                                 }
103                                 $dbh->do(qq{UPDATE users SET $column = ? WHERE uid = ? }
104                                         ,undef,$value,$user->{uid});
105                                 $log->execute($c->user->id,"HC changed $column from $user->{$column} to $value for user: $user->{uid} ($user->{username})");
106                         }elsif ($param =~ /^gr:(\d+)$/){
107                                 my $query;
108                                 if ($c->req->param($param) eq 'remove'){
109                                         $query = $delgroup;
110                                 }elsif($c->req->param($param) eq 'add'){
111                                         $query = $addgroup;
112                                 }
113                                 if ($query){
114                                         $query->execute($user->{uid},$1);
115                                         my ($action,$a2) = ('added','to');
116                                         ($action,$a2) = ('removed','from') if $c->req->param($param) eq 'remove';
117                                         $log->execute($c->user->id,"HC $action user: $user->{uid} ($user->{username}) $a2 group: $1");
118                                 }
119                         }
120                 }
121                 $dbh->commit;
122         };
123         if ($@){
124                 $dbh->rollback;
125                 die $@;
126         }
127         $c->res->redirect($c->uri_for('edit',$user->{uid}));
128 }
129
130 sub findUser : Private {
131         my ( $self, $c, $user ) = @_;
132         my $dbh = $c->model;
133
134         my $query = $dbh->prepare(q{
135 SELECT uid,username,hostmask,attack_points,defense_points,scan_points,humor_points,info, email, sms
136         ,COALESCE(coords(x,y,z),'') AS planet
137 FROM users u LEFT OUTER JOIN current_planet_stats p USING (pid)
138 WHERE uid = ?;
139                 });
140         $user = $dbh->selectrow_hashref($query,undef,$user);
141
142         $c->stash(u => $user);
143 }
144
145 sub mail : Local {
146         my ( $self, $c ) = @_;
147         my $dbh = $c->model;
148
149         $c->stash(ok => $c->flash->{ok});
150         $c->stash(error => $c->flash->{error});
151         $c->stash(subject => $c->flash->{subject});
152         $c->stash(message => $c->flash->{message});
153
154         my $groups = $dbh->prepare(q{SELECT gid,groupname FROM groups WHERE gid > 0 ORDER BY gid});
155         $groups->execute;
156         my @groups;
157         push @groups,{gid => -1, groupname => 'Pick a group'};
158         while (my $group = $groups->fetchrow_hashref){
159                 push @groups,$group;
160         }
161         $c->stash(groups => \@groups);
162 }
163
164 sub postmail : Local {
165         my ( $self, $c ) = @_;
166         my $dbh = $c->model;
167
168         my $emails = $dbh->prepare(q{SELECT email FROM users
169                 WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = $1)
170                         AND email is not null});
171         $emails->execute($c->req->param('group'));
172         my @emails;
173         while (my $email = $emails->fetchrow_hashref){
174                 push @emails,$email->{email};
175         }
176
177         my %mail = (
178                 smtp => 'ruin.nu',
179                 BCC      => (join ',',@emails),
180                 From    => 'NewDawn Command <nd@ruin.nu>',
181                 'Content-type' => 'text/plain; charset="UTF-8"',
182                 Subject => $c->req->param('subject'),
183                 Message => $c->req->param('message'),
184         );
185
186         if (sendmail %mail) {
187                 $c->flash(ok => \@emails);
188         }else {
189                 $c->flash(error => $Mail::Sendmail::error);
190                 $c->flash(subject => $c->req->param('subject'));
191                 $c->flash(message => $c->req->param('message'));
192         }
193
194         $c->res->redirect($c->uri_for('mail'));
195 }
196
197 =head1 AUTHOR
198
199 Micahel Andreen (harv@ruin.nu)
200
201 =head1 LICENSE
202
203 GPL 2.0, or later.
204
205 =cut
206
207 1;