如何创建jabber / XMPP代理/日志记录服务? [英] How to create a jabber/XMPP proxy/logging service?

查看:166
本文介绍了如何创建jabber / XMPP代理/日志记录服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为一家使用谷歌聊天(与我公司的支持员工匿名聊天)的公司工作,作为主要的聊天服务提供商。此服务使用XMPP(以前称为Jabber)协议发送和接收消息。

I am working for a company that is using Google Chatback (anonymous chat with a support employee in my company's case) as the main chat service provider. This service uses the XMPP (formerly known as Jabber) protocol for sending and receiving messages.

我们公司有十个支持员工帐户,可以通过我们的聊天服务访问它们在我们的网站上使用过。员工同时使用Mac OSX和Windows,以及不同操作系统上的不同客户端。聊天也可通过Android和iOS上的原生应用程序获得。

Our company has ten support employee accounts, and they are accessible through the chatback service we have used on our website. The employees use both Mac OSX and Windows, along with different clients on the different OSes. The chat is also available through native apps on both Android and iOS.

我们需要一项服务来记录聊天会话,我们一直在研究专有解决方案,但这些在移动平台上不受支持,这基本上就是交易破解者。

We need a service for logging the chat sessions, and we have been looking into proprietary solutions, but these are not supported on the mobile platforms, and that's basically the dealbreaker.

我决定的解决方案是在消息链中引入另一个链接,记录所有消息。这个想法是服务器通过这个代理发送,根据它所在的聊天会话记录消息,然后以适当的方式保存这些日志。目前,他们将所有日志存储在Dropbox文件夹中,这是一个容易出错的活动。

The solution I have decided is to introduce another link in the message chain, that logs all messages. The idea is that the server sends through this proxy, that logs the messages according to which chat session it is, and then saves those logs in an appropriate manner. Currently they are storing all the logs in a Dropbox folder, which is an error-prone activity.

理论上,这将允许我们的支持者使用任何操作系统/客户端他们选择了,日志会在同一个地方结束。

This would, in theory, allow our supporters to use whatever os/client they chose, and the logs would end up the same place.

使用Smack API进行了一些测试后,我得出结论我的XMPP客户端(Trillian同时适用于Android和Windows)回复它上次收到消息的资源。这实际上意味着我实现的非常简单的聊天记录器被忽略了。

Having conducted some tests using the Smack API, I have concluded that my XMPP client (Trillian on both Android and Windows) replies to the resource from which it last received a message. This means effectively that the very simple chat logger I have implemented simply gets ignored.

测试是使用下面的代码和另一个并行运行的客户端进行的。只有一个客户收到该消息。

The test have been conducted using the code below coupled with another client that runs in parallel. Only one of the clients receives the message.

ConnectionConfiguration config = new ConnectionConfiguration("talk.google.com", 5222, "googlemail.com");
config.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
config.setSASLAuthenticationEnabled(true);
XMPPConnection connection = new XMPPConnection(config);
connection.connect();

Presence presence = new Presence(Presence.Type.unavailable);
connection.login("android_client_username", "android_client_pass");
Message message = new Message("my_test_email@gmail.com");
message.setBody("Hello World!");
connection.sendPacket(message);
connection.sendPacket(presence);
connection.addPacketListener(new PacketListener() {
          public void processPacket(Packet packet) {
             if (packet instanceof Message) {
                Message message = (Message) packet;
                System.out.println(message.getBody()); 
             }
           }
        }, new MessageTypeFilter(Message.Type.chat));




  • 是否可以使用Google Talk服务创建此类代理,即没有托管我们自己的XMPP服务器?

  • 是否可以远程监听服务器上的所有数据包?

  • 如果没有,有什么替代方案是否存在使用开放协议(如XMPP)的匿名基于Web的聊天客户端?

  • 感谢您的时间。

    推荐答案

    如果您不使用Google Chatback服务,则可以相对轻松地设置所需的环境。为了记录XMPP消息,必须通过MUC(多用户聊天)完成聊天。您需要以下组件:

    If you DON'T USE the Google Chatback service it is relatively easy to set up the environment you need. In order to log XMPP messages, the chat must be done via MUC (multi-user-chat). You need the following components:


    • 书籍: http://professionalxmpp.com/

    • HTTP服务器

    • Jabber / XMPP服务器(例如ejabberd)

    • 每个支持席位的聊天室

    • 使用perl和Net :: Jabber(不是Net :: XMPP,因为它不支持MUC)来创建脚本/进程/守护进程将登录XMPP服务器并加入相应的聊天室。聊天室的其他参与者将是你的支持者之一,并且需要支持的人。必须以这样的方式设置脚本,使其在收到MUC消息时(例如,存储在数据库中)做出任何想要的内容。自从安装Net :: Jabber以来,没有那么多的工作,你需要添加/修改部分代码的示例脚本。

    • 如果你想通过聊天来Web浏览器,必须使用Strophe.js以通过适当的代理配置通过HTTP服务器与XMPP服务器建立BOSH连接。

    • Book: http://professionalxmpp.com/
    • HTTP server
    • Jabber/XMPP server (e.g. ejabberd)
    • Chat-room per support seat
    • Use perl and Net::Jabber (not Net::XMPP since it does not support MUC) to create script/process/daemon which will login to the XMPP server and join the appropriate chat-room. Other participants in the chat-room would be one of your support guys, and the guy asking for support. The script must be set in such a way that it makes whatever you want upon the receipt of MUC message (e.g. store in database). Not so much of a job since when you install Net::Jabber, there are example scripts in which you need to add/modify only part of the code.
    • If you want to chat via web browser, Strophe.js must be used in order to establish BOSH connection with the XMPP server, via HTTP server by proper proxy configuration.

    所有这些东西都可以在书中找到,除了使用Net :: Jabber的Perl脚本。

    All this stuff can be found in the book, except for Perl script using Net::Jabber.

    我可能没什么帮助但是如果你决定去这样,我会帮忙。如果Google Chatback支持MUC,那么您只需要Perl / Net :: Jabber部分。

    I was maybe not much of a help but if you decide to go this way, I'll help. If Google Chatback supports MUC, then all you need is Perl/Net::Jabber part.

    编辑:perl XMPP守护程序

    the perl XMPP daemon

    #!/usr/bin/perl -w
    
    use strict;
    use Net::Jabber;
    use threads;
    use DBI;
    
    my $server = shift @ARGV;
    my $port = shift @ARGV;
    my $username = shift @ARGV;
    my $password = shift @ARGV;
    my $resource = shift @ARGV;
    my $chatroom = shift @ARGV;
    
    my %img = ('URGENT' => 'urgent.png',
                'HIGH' => 'high.png',
                'MEDIUM' => 'medium.png',
                'LOW' => 'low.png');
    
    my $dbname_status= 'db';
    my $dbuser_status= 'user';
    my $dbpass_status= 'pass';
    my $dbhost_status = 'localhost';
    my $dbport_status = 5432;
    
    my $dbh_status = DBI->connect("dbi:Pg:dbname=$dbname_status;host=$dbhost_status;port=$dbport_status", $dbuser_status, $dbpass_status, {AutoCommit => 0, RaiseError => 1});
    my $sth_status = $dbh_status->prepare(qq{SELECT * FROM sosrhs_ticketstatus});
    $sth_status->execute;
    my %status = ();
    while (my $res = $sth_status->fetchrow_hashref)
    {
        $status{$res->{status}} = $res->{id};
    }
    $sth_status->finish;
    $dbh_status->disconnect;
    
    print "\nSERVER: ", $server, "\n";
    print 'PORT: ', $port, "\n";
    print 'USERNAME: ', $username, "\n";
    print 'RESOURCE: ', $resource, "\n";
    
    
    $SIG{HUP} = \&Stop;
    $SIG{KILL} = \&Stop;
    $SIG{TERM} = \&Stop;
    $SIG{INT} = \&Stop;
    
    my $Connection = new Net::Jabber::Client();
    
    $Connection->SetCallBacks(message => sub {threads->create('InMessage', (@_))->join()},
                              presence => sub {threads->create('InPresence', (@_))->join()},
                              iq => sub {threads->create('InIQ', (@_))->join()}
                              );
    
    my $status = $Connection->Connect(hostname=>$server,
                                      port=>$port,
                                     );
    
    if (!(defined($status)))
    {
        print "ERROR:  Jabber server is down or connection was not allowed.\n";
        print "        ($!)\n";
        exit(0);
    }
    
    my @result = $Connection->AuthSend(username=>$username,
                                       password=>$password,
                                       resource=>$resource);
    
    if ($result[0] ne "ok")
    {
        print "ERROR: Authorization failed: $result[0] - $result[1]\n";
        exit(0);
    }
    
    print "Logged in to $server:$port...\n";
    
    $Connection->RosterGet();
    
    print "Getting Roster to tell server to send presence info...\n";
    
    $Connection->PresenceSend();
    
    print "Sending presence to tell world that we are logged in...\n";
    
    $Connection->MUCJoin(room => $chatroom,
                        server => 'conference.' . $server,
                        nick => $username);
    
    print 'Join ' . $chatroom . '@conference.sosrhs MUC room...';
    print "\n";
    
    while(defined($Connection->Process())) { }
    
    print "ERROR: The connection was killed...\n";
    
    exit(0);
    
    
    sub Stop
    {
        print "Exiting...\n";
        $Connection->Disconnect();
        exit(0);
    }
    
    
    sub InMessage
    {
        my $sid = shift;
        my $message = shift;
    
        my $type = $message->GetType();
        my $fromJID = $message->GetFrom("jid");
    
        my $from = $fromJID->GetUserID();
        my $resource = $fromJID->GetResource();
        my $subject = $message->GetSubject();
        my $body = $message->GetBody();
        #print "===\n";
        #print "Message ($type)\n";
        #print "  From: $from ($resource)\n";
        #print "  Subject: $subject\n";
        #print "  Body: $body\n";
        #print "===\n";
        #print $message->GetXML(),"\n";
        #print "===\n";
    
        if ($from eq 'ticket_distributor')
        {
            if ($body =~ /^ticketrelay /)
            {
                &to_group($body);
            }
            elsif ($body =~ /^ackrelay /)
            {
                &to_group_ack($body);
            }
            elsif ($body =~ /^ticketupdaterelay /)
            {
                &to_group_update($body);
            }
            elsif ($body =~ /^ticketwithdrawrelay /)
            {
                &to_group_withdraw($body);
            }
            elsif ($body =~ /^ticketclearrelay /)
            {
                &to_group_clear($body);
            }
            elsif ($body =~ /^ticketcloserelay /)
            {
                &to_group_close($body);
            }
            elsif ($body =~ /^ticketfwdrelay /)
            {
                &to_group_fwd($body);
            }
        }
        else
        {
            if ($body =~ /^ticketnew /)
            {
                &to_group($body);
                &to_ticket_distributor($body);
            }
            elsif ($body =~ /^ack /)
            {
                &to_ticket_distributor_ack($body);
            }
            elsif ($body =~ /^ticketupdate /)
            {
                &to_ticket_distributor_update($body);
            }
            elsif ($body =~ /^ticketwithdraw /)
            {
                &to_ticket_distributor_withdraw($body);
            }
            elsif ($body =~ /^ticketclear /)
            {
                &to_ticket_distributor_clear($body);
            }
            elsif ($body =~ /^ticketclose /)
            {
                &to_ticket_distributor_close($body);
            }
            elsif ($body =~ /^ticketfwd /)
            {
                &to_ticket_distributor_fwd($body);
            }
        }
    }
    
    
    sub InIQ
    {
        my $sid = shift;
        my $iq = shift;
    
        my $from = $iq->GetFrom();
        my $type = $iq->GetType();
        my $query = $iq->GetQuery();
        my $xmlns = $query->GetXMLNS();
        #print "===\n";
        #print "IQ\n";
        #print "  From $from\n";
        #print "  Type: $type\n";
        #print "  XMLNS: $xmlns";
        #print "===\n";
        #print $iq->GetXML(),"\n";
        #print "===\n";
    }
    
    sub InPresence
    {
        my $sid = shift;
        my $presence = shift;
    
        my $from = $presence->GetFrom();
        my $type = $presence->GetType();
        my $status = $presence->GetStatus();
        #print "===\n";
        #print "Presence\n";
        #print "  From $from\n";
        #print "  Type: $type\n";
        #print "  Status: $status\n";
        #print "===\n";
        #print $presence->GetXML(),"\n";
        #print "===\n";
    
        if ($type eq 'subscribe')
        {
            my @usrreq = split('@', $from);
            my $usrreq = $usrreq[0] . '@' . $server;
            $Connection->Subscription(type => 'subscribed',
                                        to => $usrreq
                                        );
        }
    }
    
    # Functions for actions taken upon ticket
    sub to_ticket_distributor
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
        $sth->execute($msg[1]);
        my $group_assigned_groupnamechat = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $group_assigned_groupnamechat = $res->{group_assigned_groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => $msg[1] . ' ' . $group_assigned_groupnamechat);
    }
    
    sub to_ticket_distributor_ack
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1] $msg[2]\n";
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'WORK IN PROGRESS'}, user_accepted = '$msg[2]', tmstmp_accepted = now() WHERE ticket_id = $msg[1]});
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
        $sth->execute($msg[1]);
        my $user_creator_groups_id = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groups_id = $res->{user_creator_groups_id};
        }
        $sth->finish;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
        $sth->execute($user_creator_groups_id);
        my $user_creator_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ackrelay ' . $msg[1] . ' ' . $user_creator_groupchatname);
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ackfinish ' . $msg[1]);
    }
    
    sub to_ticket_distributor_update
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1] $msg[2]\n";
        my $ticket_action = shift @msg;
        my $ticket_id = shift @msg;
        my $user_id_update = shift @msg;
        my $ticket_comment = join(' ', @msg);
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->prepare(qq{INSERT INTO sosrhs_tickets_comments (ticket_id, users_id, comment) VALUES (?, ?, ?)});
        $sth->execute($ticket_id, $user_id_update, $ticket_comment);
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
        $sth->execute($ticket_id);
        my $user_creator_groups_id = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groups_id = $res->{user_creator_groups_id};
        }
        $sth->finish;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
        $sth->execute($user_creator_groups_id);
        my $user_creator_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ticketupdaterelay ' . $ticket_id . ' ' . $user_creator_groupchatname);
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketupdatefinish ' . $ticket_id);
    }
    
    sub to_ticket_distributor_withdraw
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
        my $ticket_action = shift @msg;
        my $ticket_id = shift @msg;
        my $user_id_withdraw = shift @msg;
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'WITHDRAWN'}, user_withdrawn = $user_id_withdraw, tmstmp_withdrawn = now() WHERE ticket_id = $ticket_id});
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
        $sth->execute($ticket_id);
        my $user_creator_groups_id = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groups_id = $res->{user_creator_groups_id};
        }
        $sth->finish;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
        $sth->execute($user_creator_groups_id);
        my $user_creator_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ticketwithdrawrelay ' . $ticket_id . ' ' . $user_creator_groupchatname);
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketwithdrawfinish ' . $ticket_id);
    }
    
    sub to_ticket_distributor_clear
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
        my $ticket_action = shift @msg;
        my $ticket_id = shift @msg;
        my $user_id_clear = shift @msg;
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'CLEARED'}, user_cleared = $user_id_clear, tmstmp_cleared = now() WHERE ticket_id = $ticket_id});
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
        $sth->execute($ticket_id);
        my $user_creator_groups_id = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groups_id = $res->{user_creator_groups_id};
        }
        $sth->finish;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
        $sth->execute($user_creator_groups_id);
        my $user_creator_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ticketclearrelay ' . $ticket_id . ' ' . $user_creator_groupchatname);
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketclearfinish ' . $ticket_id);
    }
    
    sub to_ticket_distributor_close
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
        my $ticket_action = shift @msg;
        my $ticket_id = shift @msg;
        my $user_id_close = shift @msg;
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'CLOSED'}, user_closed = $user_id_close, tmstmp_closed = now() WHERE ticket_id = $ticket_id});
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_users_v WHERE groups_id = (SELECT group_assigned_id FROM sosrhs_tickets_v WHERE ticket_id = ?)});
        $sth->execute($ticket_id);
        my $user_accepted_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_accepted_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ticketcloserelay ' . $ticket_id . ' ' . $user_accepted_groupchatname);
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketclosefinish ' . $ticket_id);
    }
    
    sub to_ticket_distributor_fwd
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1] $msg[2]\n";
        my $ticket_action = shift @msg;
        my $ticket_id = shift @msg;
        my $user_id_fwd = shift @msg;
        my $group_id_fwd_to = shift @msg;
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'ASSIGNED'}, user_accepted = NULL, tmstmp_accepted = NULL, group_assigned = $group_id_fwd_to WHERE ticket_id = $ticket_id});
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{INSERT INTO sosrhs_tickets_comments (ticket_id, users_id, groups_id_fwd_to) VALUES (?, ?, ?)});
        $sth->execute($ticket_id, $user_id_fwd, $group_id_fwd_to);
        $dbh->commit;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = (SELECT group_assigned_id FROM sosrhs_tickets_v WHERE ticket_id = ?)});
        $sth->execute($ticket_id);
        my $user_fwd_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_fwd_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = (SELECT user_creator_groups_id FROM sosrhs_tickets_v WHERE ticket_id = ?)});
        $sth->execute($ticket_id);
        my $user_creator_groupchatname = '';
        while (my $res = $sth->fetchrow_hashref)
        {
            $user_creator_groupchatname = $res->{groupnamechat};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ticketfwdrelay ' . $ticket_id . ' ' . $user_fwd_groupchatname);
    
        $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                                type => 'chat',
                                body => 'ticketfwdrelay ' . $ticket_id . ' ' . $user_creator_groupchatname);
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketfwdfinish ' . $ticket_id);
    }
    
    # Functions for relayed actions from ticket_distributor
    sub to_group
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => &build_new_ticket_message($msg[1]));
    }
    
    sub to_group_ack
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ackrelay ' . $msg[1]);
    }
    
    sub to_group_update
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketupdaterelay ' . $msg[1]);
    }
    
    sub to_group_withdraw
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketwithdrawrelay ' . $msg[1]);
    }
    
    sub to_group_clear
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketclearrelay ' . $msg[1]);
    }
    
    sub to_group_close
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketcloserelay ' . $msg[1]);
    }
    
    sub to_group_fwd
    {
        my $msg = shift;
        my @msg = split(' ', $msg);
        print "\n$username : $msg[0] $msg[1]\n";
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => 'ticketfwdrelay ' . $msg[1]);
    
        sleep 2;
    
        $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                                type => 'groupchat',
                                body => &build_new_ticket_message($msg[1]));
    }
    
    sub build_new_ticket_message
    {
        my $ticket_id = shift;
    
        my $dbname= 'db';
        my $dbuser= 'user';
        my $dbpass= 'pass';
        my $dbhost = 'localhost';
        my $dbport = 5432;
    
        my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
        my $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
        $sth->execute($ticket_id);
        my %ticket = ();
        while (my $res = $sth->fetchrow_hashref)
        {
            $ticket{ticket_id} = $res->{ticket_id};
            $ticket{ticketcategory_category} = $res->{ticketcategory_category};
            $ticket{ticketstatus_status} = $res->{ticketstatus_status};
            $ticket{ticketpriority_severityname} = $res->{ticketpriority_severityname};
            $ticket{tmstmp_assigned} = $res->{tmstmp_assigned};
            $ticket{user_creator_firstname} = $res->{user_creator_firstname};
            $ticket{user_creator_secondname} = $res->{user_creator_secondname};
            $ticket{group_assigned_groupname} = $res->{group_assigned_groupname};
            $ticket{ticket_text} = $res->{ticket_text};
            $ticket{ticket_file} = $res->{ticket_file};
            $ticket{subject} = $res->{subject};
            $ticket{user_creator_groups_id} = $res->{user_creator_groups_id};
        }
        $sth->finish;
    
        $dbh->disconnect;
    
        my $html_msg = q!<p id="p! . $ticket{ticket_id} . q!">
                            <img src="/sosrhs/images/! . $img{$ticket{ticketpriority_severityname}} . q!"/>&nbsp;<text id="t! . $ticket{ticket_id} . q!" class="textmainleft">! . substr($ticket{tmstmp_assigned}, 0, 16) . '&nbsp;|&nbsp;' . $ticket{ticketstatus_status} . '&nbsp;|&nbsp;' . $ticket{ticketcategory_category} . '&nbsp;|&nbsp;' . $ticket{subject} . '<br>From:&nbsp;' . $ticket{user_creator_firstname} . '&nbsp;' . $ticket{user_creator_secondname} . '&nbsp;|&nbsp;To:&nbsp;' . $ticket{group_assigned_groupname} . q!</text>&nbsp;|&nbsp;<a href="#" onClick="$('#explanation').fadeOut('fast'); $('div.divmainleft > p').css('background-color', 'white'); $('#p! . $ticket{ticket_id} . q!').css('background-color', '#E0E0F8'); $('#tdexplanation').load('/cgi-bin/sosrhs/ticket_details.pl?ticket_id=! . $ticket{ticket_id} . q!&my_groupchatname=! . $chatroom . q!');">Details</a>
                        </p>!;
    
                        #<hr id="h! . $ticket{ticket_id} . q!" style="height: 1px; border-width: 0; color: gray; background-color: gray;"/>!;
    
        return $html_msg;
    }
    

    这篇关于如何创建jabber / XMPP代理/日志记录服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆