Ticket #3156: fixhistory-spam-timestamps-and-initialjoins.diff
File fixhistory-spam-timestamps-and-initialjoins.diff, 7.9 KB (added by , 9 years ago) |
---|
-
source/lobby/XmppClient.cpp
615 615 scriptInterface.SetProperty(ret, "message", message.message); 616 616 if (!message.data.empty()) 617 617 scriptInterface.SetProperty(ret, "data", message.data); 618 618 if (!message.datetime.empty()) 619 scriptInterface.SetProperty(ret, "datetime", message.datetime); 620 619 621 m_GuiMessageQueue.pop_front(); 620 622 } 621 623 … … 648 650 message.type = L"mucmessage"; 649 651 message.from = wstring_from_utf8(msg.from().resource().to_string()); 650 652 message.text = wstring_from_utf8(msg.body().to_string()); 653 if (msg.when()) 654 // See http://xmpp.org/extensions/xep-0082.html#sect-idp285136 for format 655 message.datetime = msg.when()->stamp().to_string(); 651 656 PushGuiMessage(message); 652 657 } 653 658 … … 662 667 GUIMessage message; 663 668 message.from = wstring_from_utf8(msg.from().username().to_string()); 664 669 message.message = wstring_from_utf8(msg.body().to_string()); 670 if (msg.when()) 671 //See http://xmpp.org/extensions/xep-0082.html#sect-idp285136 for format 672 message.datetime = msg.when()->stamp().to_string(); 665 673 PushGuiMessage(message); 666 674 } 667 675 -
source/lobby/XmppClient.h
131 131 std::wstring data; 132 132 std::wstring from; 133 133 std::wstring message; 134 std::string datetime; 134 135 }; 135 136 void GuiPollMessage(ScriptInterface& scriptInterface, JS::MutableHandleValue ret); 136 137 void SendMUCMessage(const std::string& message); -
source/lobby/glooxwrapper/glooxwrapper.cpp
383 383 } 384 384 385 385 386 glooxwrapper::DelayedDelivery::DelayedDelivery(const gloox::DelayedDelivery* wrapped) 387 { 388 m_Wrapped = wrapped; 389 } 390 391 const glooxwrapper::string glooxwrapper::DelayedDelivery::stamp() const 392 { 393 return m_Wrapped->stamp(); 394 } 395 396 386 397 glooxwrapper::Disco::Disco(gloox::Disco* wrapped) 387 398 { 388 399 m_Wrapped = wrapped; … … 513 524 return m_Wrapped->thread(); 514 525 } 515 526 527 const glooxwrapper::DelayedDelivery* glooxwrapper::Message::when() const 528 { 529 const gloox::DelayedDelivery* wrapped = m_Wrapped->when(); 530 if (wrapped == 0) 531 return 0; 532 return new glooxwrapper::DelayedDelivery(wrapped); 533 } 516 534 535 517 536 glooxwrapper::MUCRoom::MUCRoom(Client* parent, const JID& nick, MUCRoomHandler* mrh, MUCRoomConfigHandler* UNUSED(mrch)) 518 537 { 519 538 m_HandlerWrapper = new MUCRoomHandlerWrapper(mrh); -
source/lobby/glooxwrapper/glooxwrapper.h
85 85 { 86 86 class Client; 87 87 class DataForm; 88 class DelayedDelivery; 88 89 class Disco; 89 90 class IQ; 90 91 class JID; … … 406 407 void disconnect(); 407 408 }; 408 409 410 class GLOOXWRAPPER_API DelayedDelivery 411 { 412 NONCOPYABLE(DelayedDelivery); 413 private: 414 const gloox::DelayedDelivery* m_Wrapped; 415 public: 416 DelayedDelivery(const gloox::DelayedDelivery* wrapped); 417 const string stamp() const; 418 }; 419 409 420 class GLOOXWRAPPER_API Disco 410 421 { 411 422 NONCOPYABLE(Disco); … … 480 491 string body() const; 481 492 string subject(const string& lang = "default") const; 482 493 string thread() const; 494 const glooxwrapper::DelayedDelivery* when() const; 483 495 }; 484 496 485 497 class GLOOXWRAPPER_API MUCRoom -
binaries/data/mods/public/gui/lobby/lobby.js
10 10 const g_mapTypes = ["skirmish", "random", "scenario"]; 11 11 var g_userRating = ""; // Rating of user, defaults to Unrated 12 12 var g_modPrefix = "@"; 13 var g_joined = false; 13 14 // Block spammers for 30 seconds. 14 15 var SPAM_BLOCK_LENGTH = 30; 15 16 … … 613 614 { 614 615 case "mucmessage": // For room messages 615 616 var from = escapeText(message.from); 616 addChatMessage({ "from": from, "text": text 617 addChatMessage({ "from": from, "text": text, "datetime": message.datetime}); 617 618 break; 618 619 case "message": // For private messages 619 620 var from = escapeText(message.from); 620 addChatMessage({ "from": from, "text": text 621 addChatMessage({ "from": from, "text": text, "datetime": message.datetime}); 621 622 break; 622 623 case "muc": 623 624 var nick = message.text; … … 635 636 { 636 637 // We just joined, we need to get the full player list 637 638 [playerList, presenceList, nickList, ratingList] = updatePlayerList(); 639 // Don't display any joins until our join request bounces back 640 // Our join message should be the last one as we just got added to the stack 641 g_joined = true; 638 642 break; 639 643 } 640 var [name, status, rating] = formatPlayerListEntry(nick, presence, "-"); 641 playerList.push(name); 642 presenceList.push(status); 643 nickList.push(nick); 644 ratingList.push(String(rating)); 645 Engine.SendGetRatingList(); 646 addChatMessage({ "text": "/special " + sprintf(translate("%(nick)s has joined."), { nick: nick }), "key": g_specialKey }); 644 else if (g_joined) 645 { 646 var [name, status, rating] = formatPlayerListEntry(nick, presence, "-"); 647 playerList.push(name); 648 presenceList.push(status); 649 nickList.push(nick); 650 ratingList.push(String(rating)); 651 Engine.SendGetRatingList(); 652 addChatMessage({ "text": "/special " + sprintf(translate("%(nick)s has joined."), { nick: nick }), "key": g_specialKey }); 653 } 647 654 break; 648 655 case "leave": 649 656 if (nickIndex == -1) // Left, but not present (TODO: warn about this?) … … 819 826 if (!msg.color) 820 827 msg.color = null; 821 828 if (!msg.key) 822 msg.key = null; 829 msg.key = null; 830 if (!msg.datetime) 831 msg.datetime = null; 823 832 824 833 // Highlight local user's nick 825 834 if (msg.text.indexOf(g_Name) != -1 && g_Name != msg.from) 826 835 msg.text = msg.text.replace(new RegExp('\\b' + '\\' + g_Name + '\\b', "g"), colorPlayerName(g_Name)); 827 836 828 // Run spam test 829 updateSpamMonitor(msg.from); 837 // Run spam test if it's not a historical message 838 if (!msg.datetime) 839 updateSpamMonitor(msg.from); 830 840 if (isSpam(msg.text, msg.from)) 831 841 return; 832 842 833 843 // Format Text 834 var formatted = ircFormat(msg.text, msg.from, msg.color, msg.key );844 var formatted = ircFormat(msg.text, msg.from, msg.color, msg.key, msg.datetime); 835 845 836 846 // If there is text, add it to the chat box. 837 847 if (formatted) … … 856 866 * @param from Sender of the message. 857 867 * @param color Optional color of sender. 858 868 * @param key Key to verify join/leave messages with. TODO: Remove this, it only provides synthetic security. 869 * @param datetime Current date and time of message, only used for historical messages 859 870 * @return Formatted text. 860 871 */ 861 function ircFormat(text, from, color, key )872 function ircFormat(text, from, color, key, datetime) 862 873 { 863 874 // Generate and apply color to uncolored names, 864 875 if (!color && from) … … 912 923 // Build time header if enabled 913 924 if (g_timestamp) 914 925 { 915 // Time for optional time header916 var time = new Date(Date.now());917 926 927 var time; 928 if (datetime) 929 { 930 var parserDate = datetime.split("T")[0].split("-"); 931 var parserTime = datetime.split("T")[1].split(":"); 932 // See http://xmpp.org/extensions/xep-0082.html#sect-idp285136 for format of datetime 933 // Date takes Year, Month, Day, Hour, Minute, Second 934 time = new Date(Date.UTC(parserDate[0], parserDate[1], parserDate[2], parserTime[0], parserTime[1], parserTime[2].split("Z")[0])); 935 } 936 else 937 time = new Date(Date.now()); 938 918 939 // Translation: Time as shown in the multiplayer lobby (when you enable it in the options page). 919 940 // For a list of symbols that you can use, see: 920 941 // https://sites.google.com/site/icuprojectuserguide/formatparse/datetime?pli=1#TOC-Date-Field-Symbol-Table