| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- <?php
- if ($myUser == null) {
- redirectToLogin();
- }
- function handleMsgPost() {
- global $myUser;
- if (!isset($_POST['receiver'])) {
- return 'fail';
- }
- if (!isset($_POST['message'])) {
- return 'fail';
- }
- if (0 > strlen($_POST['message']) || strlen($_POST['message']) > 65535) {
- return 'fail';
- }
- $receiver = $_POST['receiver'];
- $esc_message = DB::escape($_POST['message']);
- $sender = $myUser['username'];
- if (!validateUsername($receiver) || !queryUser($receiver)) {
- return 'fail';
- }
- DB::query("insert into user_msg (sender, receiver, message, send_time) values ('$sender', '$receiver', '$esc_message', now())");
- return "ok";
- }
- function getConversations() {
- global $myUser;
- $username = $myUser['username'];
- $result = DB::query( "select * from user_msg where sender = '$username' or receiver = '$username' order by send_time DESC" );
- $ret = array();
- while ($msg = DB::fetch($result)) {
- if ($msg['sender'] !== $username) {
- if (isset($ret[$msg['sender']])) {
- $ret[$msg['sender']][1] |= ($msg['read_time'] == null);
- continue;
- }
- $ret[$msg['sender']] = array($msg['send_time'], ($msg['read_time'] == null));
- } else {
- if (isset($ret[$msg['receiver']])) {
- continue;
- }
- $ret[$msg['receiver']] = array($msg['send_time'], 0);
- }
- }
- $res = [];
- foreach ($ret as $name => $con) {
- $res[] = [$con[0], $con[1], $name];
- }
- usort($res, function($a, $b) {
- return -strcmp($a[0], $b[0]);
- });
- return json_encode($res);
- }
- function getHistory() {
- global $myUser;
- $username = $myUser['username'];
- if (!isset($_GET['conversationName']) || !validateUsername($_GET['conversationName'])) {
- return '[]';
- }
- if (!isset($_GET['pageNumber']) || !validateUInt($_GET['pageNumber'])) {
- return '[]';
- }
- $conversationName = $_GET['conversationName'];
- $pageNumber = ($_GET['pageNumber'] - 1) * 10;
- DB::query("update user_msg set read_time = now() where sender = '$conversationName' and receiver = '$username' and read_time is null");
- $result = DB::query("select * from user_msg where (sender = '$username' and receiver = '$conversationName') or (sender = '$conversationName' and receiver = '$username') order by send_time DESC limit $pageNumber, 11");
- $ret = array();
- while ($msg = DB::fetch($result)) {
- $ret[] = array($msg['message'], $msg['send_time'], $msg['read_time'], $msg['id'], ($msg['sender'] == $username));
- }
- return json_encode($ret);
- }
- /*
- function deleteMsg($msgId) {
- return 1;
- $str = <<<EOD
- select * from user_msg
- where id = $msgId
- and read_time is null
- EOD;
- $result = DB::query($str);
- if (DB::fetch($result)) {
- $str = <<<EOD
- delete from user_msg
- where id = $msgId
- EOD;
- DB::query($str);
- return 1;
- }
- return 0;
- }
- */
- if (isset($_POST['user_msg'])) {
- die(handleMsgPost());
- } elseif (isset($_GET['getConversations'])) {
- die(getConversations());
- } elseif (isset($_GET['getHistory'])) {
- die(getHistory());
- }
- ?>
- <?php echoUOJPageHeader('私信') ?>
- <h1 class="page-header">私信</h1>
- <div id="conversations">
- </div>
- <div id="history" style="display:none">
- <div class="card border-primary">
- <div class="card-header bg-primary text-white">
- <button type="button" id="goBack" class="btn btn-info btn-sm" style="position:absolute">返回</button>
- <div id="conversation-name" class="text-center"></div>
- </div>
- <div class="card-body">
- <ul class="pagination top-buffer-no justify-content-between">
- <li class="previous"><a class="btn btn-outline-secondary text-primary" href="#" id="pageLeft">← 更早的消息</a></li>
- <li class="text-center" id="pageShow" style="line-height:32px"></li>
- <li class="next"><a class="btn btn-outline-secondary text-primary" href="#" id="pageRight">更新的消息 →</a></li>
- </ul>
- <div id="history-list" style="min-height: 200px;">
- </div>
- <ul class="pagination top-buffer-no justify-content-between">
- <li class="previous"><a class="btn btn-outline-secondary text-primary" href="#history" id="pageLeft2">← 更早的消息</a></li>
- <li class="next"><a class="btn btn-outline-secondary text-primary" href="#history" id="pageRight2">更新的消息 →</a></li>
- </ul>
- <hr />
- <form id="form-message">
- <div class="form-group" id="form-group-message">
- <textarea id="input-message" class="form-control"></textarea>
- <span id="help-message" class="help-block"></span>
- </div>
- <div class="text-right">
- <button type="submit" id="message-submit" class="btn btn-info btn-md">发送</button>
- </div>
- </form>
- </div>
- </div>
- </div>
- <script type="text/javascript">
- $(document).ready(function() {
- $.ajaxSetup({async:false});
- refreshConversations();
- <?php if (isset($_GET['enter'])): ?>
- enterConversation(<?= json_encode($_GET['enter']) ?>);
- <?php endif ?>
- });
- </script>
- <script type="text/javascript">
- function addButton(conversationName, send_time, type) {
- $("#conversations").append(
- '<div class="row top-buffer-sm">' +
- '<div class="col-sm-3">' +
- '<button type="button" class="btn btn-' + ( type ? 'warning' : 'primary' ) + ' btn-block" ' +
- 'onclick="enterConversation(\'' + conversationName + '\')">' +
- conversationName +
- '</button>' +
- '</div>' +
- '<div class="col-sm-9" style="line-height:34px">' +
- '最后发送时间:' + send_time +
- '</div>' +
- '</div>'
- );
- }
- function addBubble(content, send_time, read_time, msgId, conversation, page, type) {
- $("#history-list").append(
- '<div style=' + (type ? "margin-left:40%;margin-right:0%;" : "margin-left:0%;margin-right:40%;") + '>' +
- '<div class="card border-info mb-4">' +
- '<div class="card-body" style="background:' + (type ? '#4d92d8' : '#beb7b7') + '; word-break: break-all">' +
- '<div style="white-space:pre-wrap" ' + (type ? 'class="text-right"' : 'class="text-left"') + '>' +
- htmlspecialchars(content) +
- '</div>' +
- '</div>' +
- '<div>' +
- '<div class="row">' +
- '<div class="col-sm-6">' +
- '发送时间:' + send_time +
- '</div>' +
- '<div class="col-sm-6 text-right">' +
- '查看时间:' + (read_time == null ? '<strong>未查看</strong>' : read_time) +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>'
- );
- }
- function submitMessagePost(conversationName) {
- if ($('#input-message').val().length == 0 || $('#input-message').val().length >= 65536) {
- $('#help-message').text('私信长度必须在1~65535之间。');
- $('#form-group-message').addClass('has-error');
- return;
- }
- $('#help-message').text('');
- $('#form-group-message').removeClass('has-error');
- $.post('/user/msg', {
- user_msg : 1,
- receiver : conversationName,
- message : $('#input-message').val()
- }, function(msg) {
- $('#input-message').val("");
- });
- }
- function refreshHistory(conversation, page) {
- $("#history-list").empty();
- var ret = false;
- $('#conversation-name').text(conversation);
- $('#pageShow').text("第" + page.toString() + "页");
- $.get('/user/msg', {
- getHistory : '',
- conversationName : conversation,
- pageNumber : page
- }, function(msg) {
- var result = JSON.parse(msg);
- var cnt = 0, flag = 0, F = 0;
- if (result.length == 11) flag = 1, F = 1;
- result.reverse();
- for (msg in result) {
- if (flag) {flag = 0; continue;}
- var message = result[msg];
- addBubble(message[0], message[1], message[2], message[3], conversation, page, message[4]);
- if ((++cnt) + 1 == result.length && F) break;
- }
- if (result.length == 11) ret = true;
- });
- return ret;
- }
- function refreshConversations() {
- $("#conversations").empty();
- $.get('/user/msg', {
- getConversations : ""
- }, function(msg) {
- var result = JSON.parse(msg);
- for (i in result) {
- var conversation = result[i];
- if (conversation[1] == 1) {
- addButton(conversation[2], conversation[0], conversation[1]);
- }
- }
- for (i in result) {
- var conversation = result[i];
- if (conversation[1] == 0) {
- addButton(conversation[2], conversation[0], conversation[1]);
- }
- }
- }
- );
- }
- function enterConversation(conversationName) {
- var slideTime = 300;
- var page = 1;
- $("#conversations").hide(slideTime);
- var changeAble = refreshHistory(conversationName, page);
- $("#history").slideDown(slideTime);
- $('#form-message').unbind("submit").submit(function() {
- submitMessagePost(conversationName);
- page = 1;
- changeAble = refreshHistory(conversationName, page);
- refreshConversations();
- return false;
- });
- $('#goBack').unbind("click").click(function() {
- refreshConversations();
- $("#history").slideUp(slideTime);
- $("#conversations").show(slideTime);
- return;
- });
- $('#pageLeft').unbind("click").click(function() {
- if (changeAble) page++;
- changeAble = refreshHistory(conversationName, page);
- return false;
- });
- $('#pageLeft2').unbind("click").click(function() {
- if (changeAble) page++;
- changeAble = refreshHistory(conversationName, page);
- });
- $('#pageRight').unbind("click").click(function() {
- if (page > 1) page--;
- changeAble = refreshHistory(conversationName, page);
- return false;
- });
- $('#pageRight2').unbind("click").click(function() {
- if (page > 1) page--;
- changeAble = refreshHistory(conversationName, page);
- });
- }
- </script>
- <?php echoUOJPageFooter() ?>
|