219 lines
10 KiB
PHP
219 lines
10 KiB
PHP
|
<?php
|
||
|
namespace sockchat;
|
||
|
|
||
|
class Message {
|
||
|
public static $msgId = 0;
|
||
|
public static $bot;
|
||
|
|
||
|
protected static function SendToAll($msg) {
|
||
|
foreach(Context::$onlineUsers as $user)
|
||
|
$user->sock->send($msg);
|
||
|
}
|
||
|
|
||
|
protected static function LogToAll($user, $msg, $flags) {
|
||
|
if(!Modules::ExecuteRoutine("OnMessageLog", [$user, &$msg, "@all", &$flags])) return;
|
||
|
foreach(Context::$channelList as $channel)
|
||
|
$channel->log->Log($user, $msg, Message::$msgId, null, $flags);
|
||
|
Database::Log(gmdate("U"), $user, $msg, "@all", $flags);
|
||
|
Modules::ExecuteRoutine("OnMessageLog", [$user, $msg, "@all", $flags]);
|
||
|
}
|
||
|
|
||
|
protected static function SendToChannel($msg, $channel) {
|
||
|
if(is_string($channel)) {
|
||
|
if(Context::ChannelExists($channel)) {
|
||
|
$channel = Context::GetChannel($channel);
|
||
|
} else return;
|
||
|
}
|
||
|
|
||
|
foreach($channel->users as $user)
|
||
|
$user->sock->send($msg);
|
||
|
}
|
||
|
|
||
|
protected static function LogToChannel($user, $msg, $channel, $flags) {
|
||
|
if(is_string($channel)) {
|
||
|
if($channel[0] != "@") {
|
||
|
if (Context::ChannelExists($channel)) {
|
||
|
$channel = Context::GetChannel($channel);
|
||
|
} else return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Modules::ExecuteRoutine("OnMessageLog", [$user, &$msg, $channel, &$flags]);
|
||
|
if(!is_string($channel)) {
|
||
|
Database::Log(gmdate("U"), $user, $msg, $channel->name, $flags);
|
||
|
$channel->log->Log($user, $msg, Message::$msgId, null, $flags);
|
||
|
} else Database::Log(gmdate("U"), $user, $msg, $channel, $flags);
|
||
|
Modules::ExecuteRoutine("AfterMessageLog", [$user, $msg, $channel, $flags]);
|
||
|
}
|
||
|
|
||
|
public static function BroadcastSilentMessage($user, $msg, $channel = ALL_CHANNELS, $msgid = null, $time = null, $alert = false, $flags = "1001") {
|
||
|
if(!is_string($channel)) $channel = $channel->name;
|
||
|
$msgid = $msgid == null ? Message::$msgId : $msgid;
|
||
|
$flags = substr($flags, 0, 4) ."0";
|
||
|
if($channel == ALL_CHANNELS)
|
||
|
Message::SendToAll(Utils::PackMessage(P_CTX_DATA, ["1", $time == null ? gmdate("U") : $time, $user, $msg, $msgid, $alert == true ? "1": "0", $flags]));
|
||
|
else
|
||
|
Message::SendToChannel(Utils::PackMessage(P_CTX_DATA, ["1", $time == null ? gmdate("U") : $time, $user, $msg, $msgid, $alert == true ? "1": "0", $flags]), $channel);
|
||
|
}
|
||
|
|
||
|
public static function BroadcastSilentBotMessage($type, $langid, $params, $channel = ALL_CHANNELS, $msgid = null, $time = null, $alert = false) {
|
||
|
Message::BroadcastSilentMessage(Message::$bot, Utils::FormatBotMessage($type, $langid, $params), $channel, $msgid, $time, $alert);
|
||
|
}
|
||
|
|
||
|
public static function PrivateSilentMessage($user, $msg, $to, $msgid = null, $time = null, $alert = false, $flags = "1001", $pm = true) {
|
||
|
$msgid = $msgid == null ? Message::$msgId : $msgid;
|
||
|
$flags = substr($flags, 0, 4) . ($pm ? "1" : "0");
|
||
|
$to->sock->send(Utils::PackMessage(P_CTX_DATA, ["1", $time == null ? gmdate("U") : $time, $user, $msg, $msgid, $alert == true ? "1": "0", $flags]));
|
||
|
}
|
||
|
|
||
|
public static function PrivateSilentBotMessage($type, $langid, $params, $to, $msgid = null, $time = null, $alert = false) {
|
||
|
Message::PrivateSilentMessage(Message::$bot, Utils::FormatBotMessage($type, $langid, $params), $to, $msgid, $time, $alert, "1001", false);
|
||
|
}
|
||
|
|
||
|
public static function ClearUserContext($user, $type = CLEAR_ALL) {
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_CLR, array($type)));
|
||
|
}
|
||
|
|
||
|
public static function ClearUserContexts($channel = ALL_CHANNELS, $type = CLEAR_ALL) {
|
||
|
$out = Utils::PackMessage(P_CTX_CLR, array($type));
|
||
|
|
||
|
if($channel == ALL_CHANNELS) Message::SendToAll($out);
|
||
|
else Message::SendToChannel($out, ($channel == LOCAL_CHANNEL) ? Utils::$chat["DEFAULT_CHANNEL"] : $channel);
|
||
|
}
|
||
|
|
||
|
// NOTE: DOES NOT SANITIZE INPUT MESSAGE !! DO THIS ELSEWHERE
|
||
|
public static function BroadcastUserMessage($user, $msg, $channel = LOCAL_CHANNEL, $flags = "1001") {
|
||
|
if(!is_string($channel)) $channel = $channel->name;
|
||
|
$flags = substr($flags, 0, 4) ."0";
|
||
|
$out = Utils::PackMessage(P_SEND_MESSAGE, array(gmdate("U"), $user->id, $msg, Message::$msgId, $flags));
|
||
|
|
||
|
if($channel == ALL_CHANNELS) {
|
||
|
Message::SendToAll($out);
|
||
|
Message::LogToAll($user, $msg, $flags);
|
||
|
Message::$msgId++;
|
||
|
} else {
|
||
|
$channel = ($channel == LOCAL_CHANNEL) ? $user->channel : $channel;
|
||
|
|
||
|
if(Context::ChannelExists($channel)) {
|
||
|
Message::SendToChannel($out, Context::GetChannel($channel));
|
||
|
Message::LogToChannel($user, $msg, $channel, $flags);
|
||
|
Message::$msgId++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static function BroadcastBotMessage($type, $langid, $params, $channel = ALL_CHANNELS) {
|
||
|
$msg = Utils::FormatBotMessage($type, $langid, $params);
|
||
|
$channel = ($channel == LOCAL_CHANNEL) ? Utils::$chat["DEFAULT_CHANNEL"] : $channel;
|
||
|
Message::BroadcastUserMessage(Message::$bot, $msg, $channel);
|
||
|
}
|
||
|
|
||
|
public static function PrivateUserMessage($user, $to, $msg, $flags = "1001", $pm = true) {
|
||
|
$flags = substr($flags, 0, 4) . ($pm ? "1" : "0");
|
||
|
$out = Utils::PackMessage(P_SEND_MESSAGE, array(gmdate("U"), $user->id, $msg, Message::$msgId, $flags));
|
||
|
$to->sock->send($out);
|
||
|
if($user->id != $to->id)
|
||
|
Message::LogToChannel($user, "(@". $to->username .") ". $msg, "@priv", $flags);
|
||
|
Message::$msgId++;
|
||
|
}
|
||
|
|
||
|
public static function PrivateBotMessage($type, $langid, $params, $to) {
|
||
|
$msg = Utils::FormatBotMessage($type, $langid, $params);
|
||
|
Message::PrivateUserMessage(Message::$bot, $to, $msg, "1001", false);
|
||
|
Message::$msgId++;
|
||
|
}
|
||
|
|
||
|
public static function SendChannelToUser($user, $channel) {
|
||
|
if(is_string($channel)) $channel = Context::GetChannel($channel);
|
||
|
if($user->getRank() >= $channel->permissionLevel) $user->sock->send(Utils::PackMessage(P_CHANNEL_INFO, ["0", $channel]));
|
||
|
}
|
||
|
|
||
|
public static function SendAllChannelsToUser($user) {
|
||
|
$arr = [];
|
||
|
foreach(Context::$channelList as $channel) {
|
||
|
if($user->getRank() >= $channel->permissionLevel) array_push($arr, $channel);
|
||
|
}
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_DATA, ["2", count($arr), join(Utils::$separator, $arr)]));
|
||
|
}
|
||
|
|
||
|
public static function HandleKick($user, $length = 0) {
|
||
|
if($length == 0)
|
||
|
$user->sock->send(Utils::PackMessage(P_BAKA, ["kick"]));
|
||
|
else
|
||
|
$user->sock->send(Utils::PackMessage(P_BAKA, ["ban", date("U") + $length]));
|
||
|
}
|
||
|
|
||
|
public static function HandleUserModification($user) {
|
||
|
Message::SendToChannel(Utils::PackMessage(P_USER_CHANGE, [$user]), $user->channel);
|
||
|
}
|
||
|
|
||
|
public static function HandleJoin($user) {
|
||
|
Message::SendToChannel(Utils::PackMessage(P_USER_JOIN, array(gmdate("U"), $user, Message::$msgId)), Utils::$chat["DEFAULT_CHANNEL"]);
|
||
|
|
||
|
$user->sock->send(Utils::PackMessage(P_USER_JOIN, array("y", $user, Utils::$chat["DEFAULT_CHANNEL"])));
|
||
|
Message::LogToChannel(Message::$bot, Utils::FormatBotMessage(MSG_NORMAL, "join", array($user->username)), Utils::$chat["DEFAULT_CHANNEL"], "10010");
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_DATA, array("0", Context::GetChannel(Utils::$chat["DEFAULT_CHANNEL"])->GetAllUsers())));
|
||
|
|
||
|
$msgs = Context::GetChannel(Utils::$chat["DEFAULT_CHANNEL"])->log->GetAllLogStrings();
|
||
|
foreach($msgs as $msg)
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_DATA, array("1", $msg)));
|
||
|
|
||
|
Message::SendAllChannelsToUser($user);
|
||
|
|
||
|
Message::$msgId++;
|
||
|
}
|
||
|
|
||
|
public static function HandleChannelCreation($channel) {
|
||
|
foreach(Context::$onlineUsers as $user)
|
||
|
Message::SendChannelToUser($user, $channel);
|
||
|
}
|
||
|
|
||
|
public static function HandleChannelDeletion($channel) {
|
||
|
if(is_string($channel)) $channel = Context::GetChannel($channel);
|
||
|
|
||
|
foreach(Context::$onlineUsers as $user) {
|
||
|
if($user->getRank() >= $channel->permissionLevel) $user->sock->send(Utils::PackMessage(4, ["2", $channel->name]));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static function HandleChannelModification($channel, $oldname = "") {
|
||
|
if(is_string($channel)) $channel = Context::GetChannel($channel);
|
||
|
Database::ModifyChannel($oldname == "" ? $channel->name : $oldname, $channel->name, $channel->password, $channel->permissionLevel);
|
||
|
foreach(Context::$onlineUsers as $user) {
|
||
|
if($user->getRank() >= $channel->permissionLevel) {
|
||
|
$user->sock->send(Utils::PackMessage(4, ["1", $oldname == "" ? $channel->name : $oldname, $channel]));
|
||
|
if($user->channel == $oldname && $oldname != "") {
|
||
|
$user->sock->send(Utils::PackMessage(5, ["2", $channel->name]));
|
||
|
$user->channel = $channel->name;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static function HandleChannelSwitch($user, $to, $from) {
|
||
|
Message::SendToChannel(Utils::PackMessage(P_CHANGE_CHANNEL, array("1", $user->id, Message::$msgId)), $from);
|
||
|
Message::LogToChannel(Message::$bot, Utils::FormatBotMessage(MSG_NORMAL, "lchan", array($user->username)), $from, "10010");
|
||
|
Message::SendToChannel(Utils::PackMessage(P_CHANGE_CHANNEL, array("0", $user, Message::$msgId)), $to);
|
||
|
Message::LogToChannel(Message::$bot, Utils::FormatBotMessage(MSG_NORMAL, "jchan", array($user->username)), $to, "10010");
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_CLR, array(CLEAR_MSGNUSERS)));
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_DATA, array("0", Context::GetChannel($to)->GetAllUsers(), Message::$msgId)));
|
||
|
|
||
|
$msgs = Context::GetChannel($to)->log->GetAllLogStrings();
|
||
|
foreach($msgs as $msg)
|
||
|
$user->sock->send(Utils::PackMessage(P_CTX_DATA, array("1", $msg)));
|
||
|
|
||
|
$user->sock->send(Utils::PackMessage(P_CHANGE_CHANNEL, array("2", $to)));
|
||
|
|
||
|
Message::$msgId++;
|
||
|
}
|
||
|
|
||
|
public static function HandleLeave($user, $method = LEAVE_NORMAL) {
|
||
|
Message::SendToChannel(Utils::PackMessage(P_USER_LEAVE, array($user->id, $user->username, $method, gmdate("U"), Message::$msgId)), $user->channel);
|
||
|
Message::LogToChannel(Message::$bot, Utils::FormatBotMessage(MSG_NORMAL, $method, array($user->username)), $user->channel, "10010");
|
||
|
Message::$msgId++;
|
||
|
}
|
||
|
|
||
|
public static function DeleteMessage($id) {
|
||
|
Message::SendToAll(Utils::PackMessage(P_MSG_DEL, [$id]));
|
||
|
}
|
||
|
}
|