mirror of
https://github.com/znc/znc.git
synced 2026-03-28 17:42:41 +01:00
Merge branch 'master' of github.com:znc/znc
This commit is contained in:
@@ -128,7 +128,7 @@ class CException {
|
||||
};
|
||||
|
||||
|
||||
/** Generate a grid-like output from a given input.
|
||||
/** Generate a grid-like or list-like output from a given input.
|
||||
*
|
||||
* @code
|
||||
* CTable table;
|
||||
@@ -152,9 +152,25 @@ class CException {
|
||||
+-------+-------+
|
||||
| hello | world |
|
||||
+-------+-------+@endverbatim
|
||||
*
|
||||
* If the table has at most two columns, one can switch to ListStyle output
|
||||
* like so:
|
||||
* @code
|
||||
* CTable table;
|
||||
* table.AddColumn("a");
|
||||
* table.AddColumn("b");
|
||||
* table.SetStyle(CTable::ListStyle);
|
||||
* // ...
|
||||
* @endcode
|
||||
*
|
||||
* This will yield the following (Note that the header is omitted; asterisks
|
||||
* denote bold text):
|
||||
* @verbatim
|
||||
*hello*: world@endverbatim
|
||||
*/
|
||||
class CTable : protected std::vector<std::vector<CString>> {
|
||||
public:
|
||||
enum EStyle { GridStyle, ListStyle };
|
||||
CTable() {}
|
||||
virtual ~CTable() {}
|
||||
|
||||
@@ -162,10 +178,18 @@ class CTable : protected std::vector<std::vector<CString>> {
|
||||
* Please note that you should add all columns before starting to fill
|
||||
* the table!
|
||||
* @param sName The name of the column.
|
||||
* @return false if a column by that name already existed.
|
||||
* @return false if a column by that name already existed or the current
|
||||
* style does not allow this many columns.
|
||||
*/
|
||||
bool AddColumn(const CString& sName);
|
||||
|
||||
/** Selects the output style of the table.
|
||||
* Select between different styles for printing. Default is GridStyle.
|
||||
* @param eNewStyle Table style type.
|
||||
* @return false if the style cannot be applied (usually too many columns).
|
||||
*/
|
||||
bool SetStyle(EStyle eNewStyle);
|
||||
|
||||
/** Adds a new row to the table.
|
||||
* After calling this you can fill the row with content.
|
||||
* @return The index of this row
|
||||
@@ -213,6 +237,7 @@ class CTable : protected std::vector<std::vector<CString>> {
|
||||
std::vector<CString> m_vsHeaders;
|
||||
// Used to cache the width of a column
|
||||
std::map<CString, CString::size_type> m_msuWidths;
|
||||
EStyle eStyle = GridStyle;
|
||||
};
|
||||
|
||||
#ifdef HAVE_LIBSSL
|
||||
|
||||
@@ -116,6 +116,8 @@ class CModTcl : public CModule {
|
||||
Tcl_CreateCommand(interp, "GetCurNick", tcl_GetCurNick, this, nullptr);
|
||||
Tcl_CreateCommand(interp, "GetUsername", tcl_GetUsername, this,
|
||||
nullptr);
|
||||
Tcl_CreateCommand(interp, "GetNetworkName", tcl_GetNetworkName, this,
|
||||
nullptr);
|
||||
Tcl_CreateCommand(interp, "GetRealName", tcl_GetRealName, this,
|
||||
nullptr);
|
||||
Tcl_CreateCommand(interp, "GetVHost", tcl_GetBindHost, this, nullptr);
|
||||
@@ -305,6 +307,13 @@ class CModTcl : public CModule {
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
static int tcl_GetNetworkName STDVAR {
|
||||
CModTcl* mod = static_cast<CModTcl*>(cd);
|
||||
Tcl_SetResult(irp, (char*)mod->GetNetwork()->GetName().c_str(),
|
||||
TCL_VOLATILE);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
static int tcl_GetRealName STDVAR {
|
||||
CModTcl* mod = static_cast<CModTcl*>(cd);
|
||||
Tcl_SetResult(irp, (char*)mod->GetUser()->GetRealName().c_str(),
|
||||
|
||||
@@ -34,6 +34,7 @@ set ::botnet-nick ZNC_[GetUsername]
|
||||
set ::botnick [GetCurNick]
|
||||
set ::server [GetServer]
|
||||
set ::server-online [expr [GetServerOnline] / 1000]
|
||||
set ::network [GetNetworkName]
|
||||
|
||||
# add some eggdrop style procs
|
||||
proc putlog message {PutModule $message}
|
||||
|
||||
@@ -1,739 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2019 ZNC, see the NOTICE file for details.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <znc/User.h>
|
||||
#include <znc/IRCNetwork.h>
|
||||
|
||||
using std::set;
|
||||
using std::vector;
|
||||
using std::map;
|
||||
|
||||
// If you change these and it breaks, you get to keep the pieces
|
||||
#define CHAN_PREFIX_1 "~"
|
||||
#define CHAN_PREFIX_1C '~'
|
||||
#define CHAN_PREFIX CHAN_PREFIX_1 "#"
|
||||
|
||||
#define NICK_PREFIX CString("?")
|
||||
#define NICK_PREFIX_C '?'
|
||||
|
||||
class CPartylineChannel {
|
||||
public:
|
||||
CPartylineChannel(const CString& sName) { m_sName = sName.AsLower(); }
|
||||
~CPartylineChannel() {}
|
||||
|
||||
const CString& GetTopic() const { return m_sTopic; }
|
||||
const CString& GetName() const { return m_sName; }
|
||||
const set<CString>& GetNicks() const { return m_ssNicks; }
|
||||
|
||||
void SetTopic(const CString& s) { m_sTopic = s; }
|
||||
|
||||
void AddNick(const CString& s) { m_ssNicks.insert(s); }
|
||||
void DelNick(const CString& s) { m_ssNicks.erase(s); }
|
||||
|
||||
bool IsInChannel(const CString& s) {
|
||||
return m_ssNicks.find(s) != m_ssNicks.end();
|
||||
}
|
||||
|
||||
protected:
|
||||
CString m_sTopic;
|
||||
CString m_sName;
|
||||
set<CString> m_ssNicks;
|
||||
};
|
||||
|
||||
class CPartylineMod : public CModule {
|
||||
public:
|
||||
void ListChannelsCommand(const CString& sLine) {
|
||||
if (m_ssChannels.empty()) {
|
||||
PutModule(t_s("There are no open channels."));
|
||||
return;
|
||||
}
|
||||
|
||||
CTable Table;
|
||||
|
||||
Table.AddColumn(t_s("Channel"));
|
||||
Table.AddColumn(t_s("Users"));
|
||||
|
||||
for (set<CPartylineChannel*>::const_iterator a = m_ssChannels.begin();
|
||||
a != m_ssChannels.end(); ++a) {
|
||||
Table.AddRow();
|
||||
|
||||
Table.SetCell(t_s("Channel"), (*a)->GetName());
|
||||
Table.SetCell(t_s("Users"), CString((*a)->GetNicks().size()));
|
||||
}
|
||||
|
||||
PutModule(Table);
|
||||
}
|
||||
|
||||
MODCONSTRUCTOR(CPartylineMod) {
|
||||
AddHelpCommand();
|
||||
AddCommand("List", "", t_d("List all open channels"),
|
||||
[=](const CString& sLine) { ListChannelsCommand(sLine); });
|
||||
}
|
||||
|
||||
~CPartylineMod() override {
|
||||
// Kick all clients who are in partyline channels
|
||||
for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin();
|
||||
it != m_ssChannels.end(); ++it) {
|
||||
set<CString> ssNicks = (*it)->GetNicks();
|
||||
|
||||
for (set<CString>::const_iterator it2 = ssNicks.begin();
|
||||
it2 != ssNicks.end(); ++it2) {
|
||||
CUser* pUser = CZNC::Get().FindUser(*it2);
|
||||
vector<CClient*> vClients = pUser->GetAllClients();
|
||||
|
||||
for (vector<CClient*>::const_iterator it3 = vClients.begin();
|
||||
it3 != vClients.end(); ++it3) {
|
||||
CClient* pClient = *it3;
|
||||
pClient->PutClient(":*" + GetModName() +
|
||||
"!znc@znc.in KICK " + (*it)->GetName() +
|
||||
" " + pClient->GetNick() + " :" +
|
||||
GetModName() + " unloaded");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (!m_ssChannels.empty()) {
|
||||
delete *m_ssChannels.begin();
|
||||
m_ssChannels.erase(m_ssChannels.begin());
|
||||
}
|
||||
}
|
||||
|
||||
bool OnBoot() override {
|
||||
// The config is now read completely, so all Users are set up
|
||||
Load();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnLoad(const CString& sArgs, CString& sMessage) override {
|
||||
const map<CString, CUser*>& msUsers = CZNC::Get().GetUserMap();
|
||||
|
||||
for (map<CString, CUser*>::const_iterator it = msUsers.begin();
|
||||
it != msUsers.end(); ++it) {
|
||||
CUser* pUser = it->second;
|
||||
for (CClient* pClient : pUser->GetAllClients()) {
|
||||
CIRCNetwork* pNetwork = pClient->GetNetwork();
|
||||
if (!pNetwork || !pNetwork->IsIRCConnected() ||
|
||||
!pNetwork->GetChanPrefixes().Contains(CHAN_PREFIX_1)) {
|
||||
pClient->PutClient(
|
||||
":" + GetIRCServer(pNetwork) + " 005 " +
|
||||
pClient->GetNick() + " CHANTYPES=" +
|
||||
(pNetwork ? pNetwork->GetChanPrefixes() : "") +
|
||||
CHAN_PREFIX_1 " :are supported by this server.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VCString vsChans;
|
||||
VCString::const_iterator it;
|
||||
sArgs.Split(" ", vsChans, false);
|
||||
|
||||
for (it = vsChans.begin(); it != vsChans.end(); ++it) {
|
||||
if (it->Left(2) == CHAN_PREFIX) {
|
||||
m_ssDefaultChans.insert(it->Left(32));
|
||||
}
|
||||
}
|
||||
|
||||
Load();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Load() {
|
||||
CString sAction, sKey;
|
||||
CPartylineChannel* pChannel;
|
||||
for (MCString::iterator it = BeginNV(); it != EndNV(); ++it) {
|
||||
if (it->first.find(":") != CString::npos) {
|
||||
sAction = it->first.Token(0, false, ":");
|
||||
sKey = it->first.Token(1, true, ":");
|
||||
} else {
|
||||
// backwards compatibility for older NV data
|
||||
sAction = "fixedchan";
|
||||
sKey = it->first;
|
||||
}
|
||||
|
||||
if (sAction == "fixedchan") {
|
||||
// Sorry, this was removed
|
||||
}
|
||||
|
||||
if (sAction == "topic") {
|
||||
pChannel = FindChannel(sKey);
|
||||
if (pChannel && !(it->second).empty()) {
|
||||
PutChan(pChannel->GetNicks(), ":irc.znc.in TOPIC " +
|
||||
pChannel->GetName() +
|
||||
" :" + it->second);
|
||||
pChannel->SetTopic(it->second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void SaveTopic(CPartylineChannel* pChannel) {
|
||||
if (!pChannel->GetTopic().empty())
|
||||
SetNV("topic:" + pChannel->GetName(), pChannel->GetTopic());
|
||||
else
|
||||
DelNV("topic:" + pChannel->GetName());
|
||||
}
|
||||
|
||||
EModRet OnDeleteUser(CUser& User) override {
|
||||
// Loop through each chan
|
||||
for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin();
|
||||
it != m_ssChannels.end();) {
|
||||
CPartylineChannel* pChan = *it;
|
||||
// RemoveUser() might delete channels, so make sure our
|
||||
// iterator doesn't break.
|
||||
++it;
|
||||
RemoveUser(&User, pChan, "KICK", "User deleted", true);
|
||||
}
|
||||
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
EModRet OnNumericMessage(CNumericMessage& Msg) override {
|
||||
if (Msg.GetCode() == 5) {
|
||||
for (int i = 0; i < Msg.GetParams().size(); ++i) {
|
||||
if (Msg.GetParams()[i].StartsWith("CHANTYPES=")) {
|
||||
Msg.SetParam(i, Msg.GetParam(i) + CHAN_PREFIX_1);
|
||||
m_spInjectedPrefixes.insert(GetNetwork());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
void OnIRCDisconnected() override {
|
||||
m_spInjectedPrefixes.erase(GetNetwork());
|
||||
}
|
||||
|
||||
void OnClientLogin() override {
|
||||
CUser* pUser = GetUser();
|
||||
CClient* pClient = GetClient();
|
||||
CIRCNetwork* pNetwork = GetNetwork();
|
||||
if (!pNetwork || !pNetwork->IsIRCConnected()) {
|
||||
pClient->PutClient(":" + GetIRCServer(pNetwork) + " 005 " +
|
||||
pClient->GetNick() + " CHANTYPES=" +
|
||||
CHAN_PREFIX_1 " :are supported by this server.");
|
||||
}
|
||||
|
||||
// Make sure this user is in the default channels
|
||||
for (set<CString>::iterator a = m_ssDefaultChans.begin();
|
||||
a != m_ssDefaultChans.end(); ++a) {
|
||||
CPartylineChannel* pChannel = GetChannel(*a);
|
||||
const CString& sNick = pUser->GetUsername();
|
||||
|
||||
if (pChannel->IsInChannel(sNick)) continue;
|
||||
|
||||
CString sHost = pUser->GetBindHost();
|
||||
const set<CString>& ssNicks = pChannel->GetNicks();
|
||||
|
||||
if (sHost.empty()) {
|
||||
sHost = "znc.in";
|
||||
}
|
||||
PutChan(ssNicks,
|
||||
":" + NICK_PREFIX + sNick + "!" + pUser->GetIdent() + "@" +
|
||||
sHost + " JOIN " + *a,
|
||||
false);
|
||||
pChannel->AddNick(sNick);
|
||||
}
|
||||
|
||||
CString sNickMask = pClient->GetNickMask();
|
||||
|
||||
for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin();
|
||||
it != m_ssChannels.end(); ++it) {
|
||||
const set<CString>& ssNicks = (*it)->GetNicks();
|
||||
|
||||
if ((*it)->IsInChannel(pUser->GetUsername())) {
|
||||
pClient->PutClient(":" + sNickMask + " JOIN " +
|
||||
(*it)->GetName());
|
||||
|
||||
if (!(*it)->GetTopic().empty()) {
|
||||
pClient->PutClient(":" + GetIRCServer(pNetwork) + " 332 " +
|
||||
pClient->GetNickMask() + " " +
|
||||
(*it)->GetName() + " :" +
|
||||
(*it)->GetTopic());
|
||||
}
|
||||
|
||||
SendNickList(pUser, pNetwork, ssNicks, (*it)->GetName());
|
||||
PutChan(ssNicks, ":*" + GetModName() + "!znc@znc.in MODE " +
|
||||
(*it)->GetName() + " +" +
|
||||
CString(pUser->IsAdmin() ? "o" : "v") +
|
||||
" " + NICK_PREFIX + pUser->GetUsername(),
|
||||
false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnClientDisconnect() override {
|
||||
CUser* pUser = GetUser();
|
||||
if (!pUser->IsUserAttached() && !pUser->IsBeingDeleted()) {
|
||||
for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin();
|
||||
it != m_ssChannels.end(); ++it) {
|
||||
const set<CString>& ssNicks = (*it)->GetNicks();
|
||||
|
||||
if (ssNicks.find(pUser->GetUsername()) != ssNicks.end()) {
|
||||
PutChan(ssNicks,
|
||||
":*" + GetModName() + "!znc@znc.in MODE " +
|
||||
(*it)->GetName() + " -ov " + NICK_PREFIX +
|
||||
pUser->GetUsername() + " " + NICK_PREFIX +
|
||||
pUser->GetUsername(),
|
||||
false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EModRet OnUserRawMessage(CMessage& Msg) override {
|
||||
if ((Msg.GetCommand().Equals("WHO") ||
|
||||
Msg.GetCommand().Equals("MODE")) &&
|
||||
Msg.GetParam(0).StartsWith(CHAN_PREFIX_1)) {
|
||||
return HALT;
|
||||
} else if (Msg.GetCommand().Equals("TOPIC") &&
|
||||
Msg.GetParam(0).StartsWith(CHAN_PREFIX)) {
|
||||
const CString sChannel = Msg.As<CTopicMessage>().GetTarget();
|
||||
CString sTopic = Msg.As<CTopicMessage>().GetText();
|
||||
|
||||
sTopic.TrimPrefix(":");
|
||||
|
||||
CUser* pUser = GetUser();
|
||||
CClient* pClient = GetClient();
|
||||
CPartylineChannel* pChannel = FindChannel(sChannel);
|
||||
|
||||
if (pChannel && pChannel->IsInChannel(pUser->GetUsername())) {
|
||||
const set<CString>& ssNicks = pChannel->GetNicks();
|
||||
if (!sTopic.empty()) {
|
||||
if (pUser->IsAdmin()) {
|
||||
PutChan(ssNicks, ":" + pClient->GetNickMask() +
|
||||
" TOPIC " + sChannel + " :" +
|
||||
sTopic);
|
||||
pChannel->SetTopic(sTopic);
|
||||
SaveTopic(pChannel);
|
||||
} else {
|
||||
pUser->PutUser(":irc.znc.in 482 " + pClient->GetNick() +
|
||||
" " + sChannel +
|
||||
" :You're not channel operator");
|
||||
}
|
||||
} else {
|
||||
sTopic = pChannel->GetTopic();
|
||||
|
||||
if (sTopic.empty()) {
|
||||
pUser->PutUser(":irc.znc.in 331 " + pClient->GetNick() +
|
||||
" " + sChannel + " :No topic is set.");
|
||||
} else {
|
||||
pUser->PutUser(":irc.znc.in 332 " + pClient->GetNick() +
|
||||
" " + sChannel + " :" + sTopic);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pUser->PutUser(":irc.znc.in 442 " + pClient->GetNick() + " " +
|
||||
sChannel + " :You're not on that channel");
|
||||
}
|
||||
return HALT;
|
||||
}
|
||||
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
EModRet OnUserPart(CString& sChannel, CString& sMessage) override {
|
||||
if (sChannel.Left(1) != CHAN_PREFIX_1) {
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
if (sChannel.Left(2) != CHAN_PREFIX) {
|
||||
GetClient()->PutClient(":" + GetIRCServer(GetNetwork()) + " 401 " +
|
||||
GetClient()->GetNick() + " " + sChannel +
|
||||
" :No such channel");
|
||||
return HALT;
|
||||
}
|
||||
|
||||
CPartylineChannel* pChannel = FindChannel(sChannel);
|
||||
|
||||
PartUser(GetUser(), pChannel);
|
||||
|
||||
return HALT;
|
||||
}
|
||||
|
||||
void PartUser(CUser* pUser, CPartylineChannel* pChannel,
|
||||
const CString& sMessage = "") {
|
||||
RemoveUser(pUser, pChannel, "PART", sMessage);
|
||||
}
|
||||
|
||||
void RemoveUser(CUser* pUser, CPartylineChannel* pChannel,
|
||||
const CString& sCommand, const CString& sMessage = "",
|
||||
bool bNickAsTarget = false) {
|
||||
if (!pChannel || !pChannel->IsInChannel(pUser->GetUsername())) {
|
||||
return;
|
||||
}
|
||||
|
||||
vector<CClient*> vClients = pUser->GetAllClients();
|
||||
|
||||
CString sCmd = " " + sCommand + " ";
|
||||
CString sMsg = sMessage;
|
||||
if (!sMsg.empty()) sMsg = " :" + sMsg;
|
||||
|
||||
pChannel->DelNick(pUser->GetUsername());
|
||||
|
||||
const set<CString>& ssNicks = pChannel->GetNicks();
|
||||
CString sHost = pUser->GetBindHost();
|
||||
|
||||
if (sHost.empty()) {
|
||||
sHost = "znc.in";
|
||||
}
|
||||
|
||||
if (bNickAsTarget) {
|
||||
for (vector<CClient*>::const_iterator it = vClients.begin();
|
||||
it != vClients.end(); ++it) {
|
||||
CClient* pClient = *it;
|
||||
|
||||
pClient->PutClient(":" + pClient->GetNickMask() + sCmd +
|
||||
pChannel->GetName() + " " +
|
||||
pClient->GetNick() + sMsg);
|
||||
}
|
||||
|
||||
PutChan(ssNicks, ":" + NICK_PREFIX + pUser->GetUsername() + "!" +
|
||||
pUser->GetIdent() + "@" + sHost + sCmd +
|
||||
pChannel->GetName() + " " + NICK_PREFIX +
|
||||
pUser->GetUsername() + sMsg,
|
||||
false, true, pUser);
|
||||
} else {
|
||||
for (vector<CClient*>::const_iterator it = vClients.begin();
|
||||
it != vClients.end(); ++it) {
|
||||
CClient* pClient = *it;
|
||||
|
||||
pClient->PutClient(":" + pClient->GetNickMask() + sCmd +
|
||||
pChannel->GetName() + sMsg);
|
||||
}
|
||||
|
||||
PutChan(ssNicks, ":" + NICK_PREFIX + pUser->GetUsername() + "!" +
|
||||
pUser->GetIdent() + "@" + sHost + sCmd +
|
||||
pChannel->GetName() + sMsg,
|
||||
false, true, pUser);
|
||||
}
|
||||
|
||||
if (!pUser->IsBeingDeleted() &&
|
||||
m_ssDefaultChans.find(pChannel->GetName()) !=
|
||||
m_ssDefaultChans.end()) {
|
||||
JoinUser(pUser, pChannel);
|
||||
}
|
||||
|
||||
if (ssNicks.empty()) {
|
||||
delete pChannel;
|
||||
m_ssChannels.erase(pChannel);
|
||||
}
|
||||
}
|
||||
|
||||
EModRet OnUserJoin(CString& sChannel, CString& sKey) override {
|
||||
if (sChannel.Left(1) != CHAN_PREFIX_1) {
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
if (sChannel.Left(2) != CHAN_PREFIX) {
|
||||
GetClient()->PutClient(":" + GetIRCServer(GetNetwork()) + " 403 " +
|
||||
GetClient()->GetNick() + " " + sChannel +
|
||||
" :Channels look like " CHAN_PREFIX "znc");
|
||||
return HALT;
|
||||
}
|
||||
|
||||
sChannel = sChannel.Left(32);
|
||||
CPartylineChannel* pChannel = GetChannel(sChannel);
|
||||
|
||||
JoinUser(GetUser(), pChannel);
|
||||
|
||||
return HALT;
|
||||
}
|
||||
|
||||
void JoinUser(CUser* pUser, CPartylineChannel* pChannel) {
|
||||
if (pChannel && !pChannel->IsInChannel(pUser->GetUsername())) {
|
||||
vector<CClient*> vClients = pUser->GetAllClients();
|
||||
|
||||
const set<CString>& ssNicks = pChannel->GetNicks();
|
||||
const CString& sNick = pUser->GetUsername();
|
||||
pChannel->AddNick(sNick);
|
||||
|
||||
CString sHost = pUser->GetBindHost();
|
||||
|
||||
if (sHost.empty()) {
|
||||
sHost = "znc.in";
|
||||
}
|
||||
|
||||
for (vector<CClient*>::const_iterator it = vClients.begin();
|
||||
it != vClients.end(); ++it) {
|
||||
CClient* pClient = *it;
|
||||
pClient->PutClient(":" + pClient->GetNickMask() + " JOIN " +
|
||||
pChannel->GetName());
|
||||
}
|
||||
|
||||
PutChan(ssNicks,
|
||||
":" + NICK_PREFIX + sNick + "!" + pUser->GetIdent() + "@" +
|
||||
sHost + " JOIN " + pChannel->GetName(),
|
||||
false, true, pUser);
|
||||
|
||||
if (!pChannel->GetTopic().empty()) {
|
||||
for (vector<CClient*>::const_iterator it = vClients.begin();
|
||||
it != vClients.end(); ++it) {
|
||||
CClient* pClient = *it;
|
||||
pClient->PutClient(
|
||||
":" + GetIRCServer(pClient->GetNetwork()) + " 332 " +
|
||||
pClient->GetNickMask() + " " + pChannel->GetName() +
|
||||
" :" + pChannel->GetTopic());
|
||||
}
|
||||
}
|
||||
|
||||
SendNickList(pUser, nullptr, ssNicks, pChannel->GetName());
|
||||
|
||||
/* Tell the other clients we have op or voice, the current user's
|
||||
* clients already know from NAMES list */
|
||||
|
||||
if (pUser->IsAdmin()) {
|
||||
PutChan(ssNicks, ":*" + GetModName() + "!znc@znc.in MODE " +
|
||||
pChannel->GetName() + " +o " +
|
||||
NICK_PREFIX + pUser->GetUsername(),
|
||||
false, false, pUser);
|
||||
}
|
||||
|
||||
PutChan(ssNicks, ":*" + GetModName() + "!znc@znc.in MODE " +
|
||||
pChannel->GetName() + " +v " + NICK_PREFIX +
|
||||
pUser->GetUsername(),
|
||||
false, false, pUser);
|
||||
}
|
||||
}
|
||||
|
||||
EModRet HandleMessage(const CString& sCmd, const CString& sTarget,
|
||||
const CString& sMessage) {
|
||||
if (sTarget.empty()) {
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
char cPrefix = sTarget[0];
|
||||
|
||||
if (cPrefix != CHAN_PREFIX_1C && cPrefix != NICK_PREFIX_C) {
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
CUser* pUser = GetUser();
|
||||
CClient* pClient = GetClient();
|
||||
CIRCNetwork* pNetwork = GetNetwork();
|
||||
CString sHost = pUser->GetBindHost();
|
||||
|
||||
if (sHost.empty()) {
|
||||
sHost = "znc.in";
|
||||
}
|
||||
|
||||
if (cPrefix == CHAN_PREFIX_1C) {
|
||||
if (FindChannel(sTarget) == nullptr) {
|
||||
pClient->PutClient(":" + GetIRCServer(pNetwork) + " 401 " +
|
||||
pClient->GetNick() + " " + sTarget +
|
||||
" :No such channel");
|
||||
return HALT;
|
||||
}
|
||||
|
||||
PutChan(sTarget, ":" + NICK_PREFIX + pUser->GetUsername() + "!" +
|
||||
pUser->GetIdent() + "@" + sHost + " " + sCmd +
|
||||
" " + sTarget + " :" + sMessage,
|
||||
true, false);
|
||||
} else {
|
||||
CString sNick = sTarget.LeftChomp_n(1);
|
||||
CUser* pTargetUser = CZNC::Get().FindUser(sNick);
|
||||
|
||||
if (pTargetUser) {
|
||||
vector<CClient*> vClients = pTargetUser->GetAllClients();
|
||||
|
||||
if (vClients.empty()) {
|
||||
pClient->PutClient(":" + GetIRCServer(pNetwork) + " 401 " +
|
||||
pClient->GetNick() + " " + sTarget +
|
||||
" :User is not attached: " + sNick + "");
|
||||
return HALT;
|
||||
}
|
||||
|
||||
for (vector<CClient*>::const_iterator it = vClients.begin();
|
||||
it != vClients.end(); ++it) {
|
||||
CClient* pTarget = *it;
|
||||
|
||||
pTarget->PutClient(
|
||||
":" + NICK_PREFIX + pUser->GetUsername() + "!" +
|
||||
pUser->GetIdent() + "@" + sHost + " " + sCmd + " " +
|
||||
pTarget->GetNick() + " :" + sMessage);
|
||||
}
|
||||
} else {
|
||||
pClient->PutClient(":" + GetIRCServer(pNetwork) + " 401 " +
|
||||
pClient->GetNick() + " " + sTarget +
|
||||
" :No such znc user: " + sNick + "");
|
||||
}
|
||||
}
|
||||
|
||||
return HALT;
|
||||
}
|
||||
|
||||
EModRet OnUserMsg(CString& sTarget, CString& sMessage) override {
|
||||
return HandleMessage("PRIVMSG", sTarget, sMessage);
|
||||
}
|
||||
|
||||
EModRet OnUserNotice(CString& sTarget, CString& sMessage) override {
|
||||
return HandleMessage("NOTICE", sTarget, sMessage);
|
||||
}
|
||||
|
||||
EModRet OnUserCTCP(CString& sTarget, CString& sMessage) override {
|
||||
return HandleMessage("PRIVMSG", sTarget, "\001" + sMessage + "\001");
|
||||
}
|
||||
|
||||
EModRet OnUserCTCPReply(CString& sTarget, CString& sMessage) override {
|
||||
return HandleMessage("NOTICE", sTarget, "\001" + sMessage + "\001");
|
||||
}
|
||||
|
||||
const CString GetIRCServer(CIRCNetwork* pNetwork) {
|
||||
if (!pNetwork) {
|
||||
return "irc.znc.in";
|
||||
}
|
||||
|
||||
const CString& sServer = pNetwork->GetIRCServer();
|
||||
if (!sServer.empty()) return sServer;
|
||||
return "irc.znc.in";
|
||||
}
|
||||
|
||||
bool PutChan(const CString& sChan, const CString& sLine,
|
||||
bool bIncludeCurUser = true, bool bIncludeClient = true,
|
||||
CUser* pUser = nullptr, CClient* pClient = nullptr) {
|
||||
CPartylineChannel* pChannel = FindChannel(sChan);
|
||||
|
||||
if (pChannel != nullptr) {
|
||||
PutChan(pChannel->GetNicks(), sLine, bIncludeCurUser,
|
||||
bIncludeClient, pUser, pClient);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void PutChan(const set<CString>& ssNicks, const CString& sLine,
|
||||
bool bIncludeCurUser = true, bool bIncludeClient = true,
|
||||
CUser* pUser = nullptr, CClient* pClient = nullptr) {
|
||||
const map<CString, CUser*>& msUsers = CZNC::Get().GetUserMap();
|
||||
|
||||
if (!pUser) pUser = GetUser();
|
||||
if (!pClient) pClient = GetClient();
|
||||
|
||||
for (map<CString, CUser*>::const_iterator it = msUsers.begin();
|
||||
it != msUsers.end(); ++it) {
|
||||
if (ssNicks.find(it->first) != ssNicks.end()) {
|
||||
if (it->second == pUser) {
|
||||
if (bIncludeCurUser) {
|
||||
it->second->PutAllUser(
|
||||
sLine, nullptr,
|
||||
(bIncludeClient ? nullptr : pClient));
|
||||
}
|
||||
} else {
|
||||
it->second->PutAllUser(sLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PutUserIRCNick(CUser* pUser, const CString& sPre,
|
||||
const CString& sPost) {
|
||||
const vector<CClient*>& vClients = pUser->GetAllClients();
|
||||
vector<CClient*>::const_iterator it;
|
||||
for (it = vClients.begin(); it != vClients.end(); ++it) {
|
||||
(*it)->PutClient(sPre + (*it)->GetNick() + sPost);
|
||||
}
|
||||
}
|
||||
|
||||
void SendNickList(CUser* pUser, CIRCNetwork* pNetwork,
|
||||
const set<CString>& ssNicks, const CString& sChan) {
|
||||
CString sNickList;
|
||||
|
||||
for (set<CString>::const_iterator it = ssNicks.begin();
|
||||
it != ssNicks.end(); ++it) {
|
||||
CUser* pChanUser = CZNC::Get().FindUser(*it);
|
||||
|
||||
if (pChanUser == pUser) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pChanUser && pChanUser->IsUserAttached()) {
|
||||
sNickList += (pChanUser->IsAdmin()) ? "@" : "+";
|
||||
}
|
||||
|
||||
sNickList += NICK_PREFIX + (*it) + " ";
|
||||
|
||||
if (sNickList.size() >= 500) {
|
||||
PutUserIRCNick(pUser, ":" + GetIRCServer(pNetwork) + " 353 ",
|
||||
" @ " + sChan + " :" + sNickList);
|
||||
sNickList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (sNickList.size()) {
|
||||
PutUserIRCNick(pUser, ":" + GetIRCServer(pNetwork) + " 353 ",
|
||||
" @ " + sChan + " :" + sNickList);
|
||||
}
|
||||
|
||||
vector<CClient*> vClients = pUser->GetAllClients();
|
||||
for (vector<CClient*>::const_iterator it = vClients.begin();
|
||||
it != vClients.end(); ++it) {
|
||||
CClient* pClient = *it;
|
||||
pClient->PutClient(":" + GetIRCServer(pNetwork) + " 353 " +
|
||||
pClient->GetNick() + " @ " + sChan + " :" +
|
||||
((pUser->IsAdmin()) ? "@" : "+") +
|
||||
pClient->GetNick());
|
||||
}
|
||||
|
||||
PutUserIRCNick(pUser, ":" + GetIRCServer(pNetwork) + " 366 ",
|
||||
" " + sChan + " :End of /NAMES list.");
|
||||
}
|
||||
|
||||
CPartylineChannel* FindChannel(const CString& sChan) {
|
||||
CString sChannel = sChan.AsLower();
|
||||
|
||||
for (set<CPartylineChannel*>::iterator it = m_ssChannels.begin();
|
||||
it != m_ssChannels.end(); ++it) {
|
||||
if ((*it)->GetName().AsLower() == sChannel) return *it;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CPartylineChannel* GetChannel(const CString& sChannel) {
|
||||
CPartylineChannel* pChannel = FindChannel(sChannel);
|
||||
|
||||
if (!pChannel) {
|
||||
pChannel = new CPartylineChannel(sChannel.AsLower());
|
||||
m_ssChannels.insert(pChannel);
|
||||
}
|
||||
|
||||
return pChannel;
|
||||
}
|
||||
|
||||
private:
|
||||
set<CPartylineChannel*> m_ssChannels;
|
||||
set<CIRCNetwork*> m_spInjectedPrefixes;
|
||||
set<CString> m_ssDefaultChans;
|
||||
};
|
||||
|
||||
template <>
|
||||
void TModInfo<CPartylineMod>(CModInfo& Info) {
|
||||
Info.SetWikiPage("partyline");
|
||||
Info.SetHasArgs(true);
|
||||
Info.SetArgsHelpText(
|
||||
Info.t_s("You may enter a list of channels the user joins, when "
|
||||
"entering the internal partyline."));
|
||||
}
|
||||
|
||||
GLOBALMODULEDEFS(
|
||||
CPartylineMod,
|
||||
t_s("Internal channels and queries for users connected to ZNC"))
|
||||
@@ -1,41 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: de\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: German\n"
|
||||
"Language: de_DE\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr "Es gibt keine offenen Kanäle."
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr "Kanal"
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr "Benutzer"
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr "Liste alle offenen Kanäle auf"
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
"Du kannst eine Liste von Kanälen angeben, die der Benutzer betritt, wenn er "
|
||||
"die interne Partyline betritt."
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr "Interne Kanäle und Queries für mit ZNC verbundene Benutzer"
|
||||
@@ -1,41 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: es-ES\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Language: es_ES\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr "No hay canales abiertos."
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr "Canal"
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr "Usuarios"
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr "Mostrar canales abiertos"
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
"Puedes añadir una lista de canales a los que el usuario se meterá cuando se "
|
||||
"conecte a la partyline."
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr "Privados y canales internos para usuarios conectados a ZNC"
|
||||
@@ -1,39 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: fr\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: French\n"
|
||||
"Language: fr_FR\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr ""
|
||||
@@ -1,39 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: id\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Indonesian\n"
|
||||
"Language: id_ID\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr ""
|
||||
@@ -1,42 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: nl\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language: nl_NL\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr "Er zijn geen open kanalen."
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr "Kanaal"
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr "Gebruikers"
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr "Laat alle open kanalen zien"
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
"Je mag een lijst van kanalen toevoegen wanneer een gebruiker toetreed tot de "
|
||||
"interne partijlijn."
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr ""
|
||||
"Interne kanalen en privé berichten voor gebruikers die verbonden zijn met ZNC"
|
||||
@@ -1,30 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr ""
|
||||
@@ -1,39 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: pt-BR\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Portuguese, Brazilian\n"
|
||||
"Language: pt_BR\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr ""
|
||||
@@ -1,41 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 "
|
||||
"&& n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 "
|
||||
"&& n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: ru\n"
|
||||
"X-Crowdin-File: /master/modules/po/partyline.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language: ru_RU\n"
|
||||
|
||||
#: partyline.cpp:60
|
||||
msgid "There are no open channels."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:66 partyline.cpp:73
|
||||
msgid "Channel"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:67 partyline.cpp:74
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:82
|
||||
msgid "List all open channels"
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:733
|
||||
msgid ""
|
||||
"You may enter a list of channels the user joins, when entering the internal "
|
||||
"partyline."
|
||||
msgstr ""
|
||||
|
||||
#: partyline.cpp:739
|
||||
msgid "Internal channels and queries for users connected to ZNC"
|
||||
msgstr ""
|
||||
@@ -1,296 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: de\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: German\n"
|
||||
"Language: de_DE\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr ""
|
||||
@@ -1,305 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: es-ES\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Language: es_ES\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr "Usuario:"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr "Introduce un nombre de usuario."
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr "Contraseña:"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr "Introduce una contraseña."
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr "Opciones"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr "Guardar"
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
"Aviso: tu host será enmascarado la próxima vez que conectes al IRC. Si "
|
||||
"quieres enmascarar tu host ahora, /msg *q Cloak. Puedes configurar tu "
|
||||
"preferencia con /msg *q SET UseCloakedHost true/false."
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr "Los siguientes comandos están disponibles:"
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr "Comando"
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr "Descripción"
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr "Auth [<usuario> <contraseña>]"
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr "Intenta autenticarte con Q. Ambos parámetros son opcionales."
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr "Intenta ponerte el modo de usuario +x para ocultar tu host real."
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr "Muestra el estado actual del módulo."
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr "Re-solicita la información actual del usuario desde Q."
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr "Set <ajuste> <valor>"
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr "Cambia el valor del ajuste. Consulta la lista de ajustes debajo."
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr "Muestra la configuración actual. Consulta la lista de ajustes debajo."
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr "Las siguientes opciones están disponibles:"
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr "Ajuste"
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr "Tipo"
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr "Cadena"
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr "Tu usuario de Q."
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr "Tu contraseña de Q."
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr "Booleano"
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr "Intentar ocultar tu host (+x) al conectar."
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
"Intentar usar el mecanismo CHALLENGEAUTH para evitar enviar la contraseña en "
|
||||
"texto plano."
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr "Pedir voz/op a Q al entrar/devoice/deop a/de un canal."
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr "Entrar a los canales cuando Q te invite."
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr "Retrasar la entrada a canales hasta que tu host haya sido ocultado."
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr "Este módulo tiene 2 parámetros opcionales: <usuario> <contraseña>"
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr "Los ajustes del módulo se guardan entre reinicios."
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr "Sintaxis: Set <ajuste> <valor>"
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr "Usuario guardado"
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr "Contraseña guardada"
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr "UseCloakedHost guardado"
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr "UseChallenge guardado"
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr "RequestPerms guardado"
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr "JoinOnInvite guardado"
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr "JoinAfterCloaked guardado"
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr "Opción desconocida: {1}"
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr "Valor"
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr "Conectado: sí"
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr "Conectado: no"
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr "Enmascarado: sí"
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr "Enmascarado: no"
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr "Autenticado: sí"
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr "Autenticado: no"
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr "Error: no estás conectado al IRC."
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr "Error: ya estás enmascarado!"
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr "Error: ya estás autenticado!"
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr "Actualización solicitada."
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr "Comando desconocido. Escribe 'Help'."
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr "Ocultación correcta: ahora tu host está enmascarado."
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr "Tus cambios han sido guardados"
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr "Cloak: intentando ocultar tu host, poniendo +x..."
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
"Tienes que configurar un nombre de usuario y una contraseña para usar este "
|
||||
"módulo. Escribe 'help' para ver más detalles."
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr "Auth: solicitando CHALLENGE..."
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr "Auth: enviando respuesta AUTH..."
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr "Auth: reto recibido, enviando petición CHALLENGEAUTH..."
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr "Fallo de autenticación: {1}"
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr "Autenticación correcta: {1}"
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
"Fallo en autenticación: Q no soporta HMAC-SHA-256 en CHALLENGEAUTH, "
|
||||
"intentando autenticación estándar."
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr "RequestPerms: pidiendo op en {1}"
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr "RequestPerms: pidiendo voz en {1}"
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr "Introduce tu nombre de usuario y contraseña de Q."
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr "Te identifica con el bot Q de Quakenet."
|
||||
@@ -1,296 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: fr\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: French\n"
|
||||
"Language: fr_FR\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr ""
|
||||
@@ -1,300 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: id\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Indonesian\n"
|
||||
"Language: id_ID\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr "Nama pengguna:"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr "Silahkan masukan nama pengguna."
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr "Kata Sandi:"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr "Silakan masukkan sandi."
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr "Opsi"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr "Simpan"
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr "Perintah berikut tersedia:"
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr "Perintah"
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr "Deskripsi"
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr "Auth [<username> <password>]"
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr ""
|
||||
"Mencoba untuk mengautentikasi anda dengan Q. Kedua parameter bersifat "
|
||||
"opsional."
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
"Mencoba untuk menetapkan usermode +x untuk menyembunyikan nama host anda "
|
||||
"yang sebenarnya."
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr "Mencetak status modul saat ini."
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr "Minta ulang informasi pengguna saat ini dari Q."
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr "Set <setting> <value>"
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr "Setelan"
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr "Tipe"
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr "String"
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr ""
|
||||
@@ -1,313 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: nl\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Language: nl_NL\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr "Gebruikersnaam:"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr "Voer alsjeblieft een gebruikersnaam in."
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr "Wachtwoord:"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr "Voer alsjeblieft een wachtwoord in."
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr "Opties"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr "Opslaan"
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
"Melding: Je host zal omhuld worden de volgende keer dat je met IRC verbind. "
|
||||
"Als je dit nu wilt doen, doe dan: /msg *q Cloak. Je kan je voorkeur "
|
||||
"instellen met /msg *q Set UseCloakedHost true/false."
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr "De volgende commando's zijn beschikbaar:"
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr "Commando"
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr "Beschrijving"
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr "Auth [<gebruikersnaam> <wachtwoord>]"
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr "Probeert je te authenticeren met Q, beide parameters zijn optioneel."
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
"Probeert gebruikersmodus +x in te stellen om je echte hostname te verbergen."
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr "Toont de huidige status van de module."
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr "Vraagt de huidige gebruikersinformatie opnieuw aan bij Q."
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr "Set <instelling> <waarde>"
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
"Past de waarde aan van de gegeven instelling. Zie de lijst van instellingen "
|
||||
"hier onder."
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
"Toont de huidige configuratie. Zie de onderstaande lijst van instellingen."
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr "De volgende instellingen zijn beschikbaar:"
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr "Instelling"
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr "Tekenreeks"
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr "Jouw Q gebruikersnaam."
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr "Jouw Q wachtwoord."
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr "Boolen (waar/onwaar)"
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr "Je hostname automatisch omhullen (+x) wanneer er verbonden is."
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
"Of CHALLENGEAUTH mechanisme gebruikt moet worden om te voorkomen dat je "
|
||||
"wachtwoord onversleuteld verstuurd word."
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
"Of je automatisch stem/beheerdersrechten van Q wilt aanvragen als je "
|
||||
"toetreed/stem kwijt raakt/beheerdersrechten kwijt raakt."
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr "Automatisch kanalen toetreden waar Q je voor uitnodigd."
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr "Wachten met het toetreden van kanalen totdat je host omhuld is."
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
"Deze module accepteerd twee optionele parameters: <gebruikersnaam> "
|
||||
"<wachtwoord>"
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr "Module instellingen worden opgeslagen tussen herstarts."
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr "Syntax: Set <instelling> <waarde>"
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr "Gebruikersnaam ingesteld"
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr "Wachtwoord ingesteld"
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr "UseCloakedHost ingesteld"
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr "UseChallenge ingesteld"
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr "RequestPerms ingesteld"
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr "JoinOnInvite ingesteld"
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr "JoinAfterCloaked ingesteld"
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr "Onbekende instelling: {1}"
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr "Waarde"
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr "Verbonden: ja"
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr "Verbonden: nee"
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr "Host omhuld: ja"
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr "Host omhuld: nee"
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr "Geauthenticeerd: ja"
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr "Geauthenticeerd: nee"
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr "Fout: Je bent niet verbonden met IRC."
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr "Fout: Je bent al omhuld!"
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr "Fout: Je bent al geauthenticeerd!"
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr "Update aangevraagd."
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr "Onbekend commando. Probeer 'help'."
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr "Omhulling succesvol: Je host is nu omhuld."
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr "Wijzigingen zijn opgeslagen!"
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr "Omhulling: Proberen je host te omhullen, +x aan het instellen..."
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
"Je moet een gebruikersnaam en wachtwoord instellen om deze module te "
|
||||
"gebruiken! Zie 'help' voor details."
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr "Auth: CHALLENGE aanvragen..."
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr "Auth: AUTH aanvraag aan het versturen..."
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr "Auth: Uitdaging ontvangen, nu CHALLENGEAUTH aanvraag sturen..."
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr "Authenticatie mislukt: {1}"
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr "Authenticatie gelukt: {1}"
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
"Auth mislukt: Q ondersteund geen HMAC-SHA-256 voor CHALLENGEAUTH, "
|
||||
"terugvallen naar standaard AUTH."
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr "RequestPerms: Beheerdersrechten aanvragen in {1}"
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr "RequestPerms: Stem aanvragen in {1}"
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr "Voer alsjeblieft je gebruikersnaam en wachtwoord in voor Q."
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr "Authenticeert je met QuakeNet's Q bot."
|
||||
287
modules/po/q.pot
287
modules/po/q.pot
@@ -1,287 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr ""
|
||||
@@ -1,296 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: pt-BR\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Portuguese, Brazilian\n"
|
||||
"Language: pt_BR\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr ""
|
||||
@@ -1,298 +0,0 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 "
|
||||
"&& n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 "
|
||||
"&& n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
|
||||
"X-Generator: crowdin.com\n"
|
||||
"X-Crowdin-Project: znc-bouncer\n"
|
||||
"X-Crowdin-Language: ru\n"
|
||||
"X-Crowdin-File: /master/modules/po/q.pot\n"
|
||||
"Project-Id-Version: znc-bouncer\n"
|
||||
"Last-Translator: DarthGandalf <alexey+crowdin@asokolov.org>\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Language: ru_RU\n"
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:11
|
||||
msgid "Username:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:13
|
||||
msgid "Please enter a username."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:16
|
||||
msgid "Password:"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:18
|
||||
msgid "Please enter a password."
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:26
|
||||
msgid "Options"
|
||||
msgstr ""
|
||||
|
||||
#: modules/po/../data/q/tmpl/index.tmpl:42
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:74
|
||||
msgid ""
|
||||
"Notice: Your host will be cloaked the next time you reconnect to IRC. If you "
|
||||
"want to cloak your host now, /msg *q Cloak. You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:111
|
||||
msgid "The following commands are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140
|
||||
msgid "Command"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141
|
||||
#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180
|
||||
#: q.cpp:186
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:116
|
||||
msgid "Auth [<username> <password>]"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:118
|
||||
msgid "Tries to authenticate you with Q. Both parameters are optional."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:124
|
||||
msgid "Tries to set usermode +x to hide your real hostname."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:128
|
||||
msgid "Prints the current status of the module."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:133
|
||||
msgid "Re-requests the current user information from Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:135
|
||||
msgid "Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:137
|
||||
msgid "Changes the value of the given setting. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:142
|
||||
msgid "Prints out the current configuration. See the list of settings below."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:146
|
||||
msgid "The following settings are available:"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178
|
||||
#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242
|
||||
#: q.cpp:245 q.cpp:248
|
||||
msgid "Setting"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179
|
||||
#: q.cpp:184
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:153 q.cpp:157
|
||||
msgid "String"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:154
|
||||
msgid "Your Q username."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:158
|
||||
msgid "Your Q password."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184
|
||||
msgid "Boolean"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:163 q.cpp:373
|
||||
msgid "Whether to cloak your hostname (+x) automatically on connect."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:169 q.cpp:381
|
||||
msgid ""
|
||||
"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in "
|
||||
"cleartext."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:175 q.cpp:389
|
||||
msgid "Whether to request voice/op from Q on join/devoice/deop."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:181 q.cpp:395
|
||||
msgid "Whether to join channels when Q invites you."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:187 q.cpp:402
|
||||
msgid "Whether to delay joining channels until after you are cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:192
|
||||
msgid "This module takes 2 optional parameters: <username> <password>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:194
|
||||
msgid "Module settings are stored between restarts."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:200
|
||||
msgid "Syntax: Set <setting> <value>"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:203
|
||||
msgid "Username set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:206
|
||||
msgid "Password set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:209
|
||||
msgid "UseCloakedHost set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:212
|
||||
msgid "UseChallenge set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:215
|
||||
msgid "RequestPerms set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:218
|
||||
msgid "JoinOnInvite set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:221
|
||||
msgid "JoinAfterCloaked set"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:223
|
||||
msgid "Unknown setting: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246
|
||||
#: q.cpp:249
|
||||
msgid "Value"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:253
|
||||
msgid "Connected: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:254
|
||||
msgid "Connected: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:255
|
||||
msgid "Cloacked: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:256
|
||||
msgid "Authenticated: yes"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:257
|
||||
msgid "Authenticated: no"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:262
|
||||
msgid "Error: You are not connected to IRC."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:270
|
||||
msgid "Error: You are already cloaked!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:276
|
||||
msgid "Error: You are already authed!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:280
|
||||
msgid "Update requested."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:283
|
||||
msgid "Unknown command. Try 'help'."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:293
|
||||
msgid "Cloak successful: Your hostname is now cloaked."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:408
|
||||
msgid "Changes have been saved!"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:435
|
||||
msgid "Cloak: Trying to cloak your hostname, setting +x..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:452
|
||||
msgid ""
|
||||
"You have to set a username and password to use this module! See 'help' for "
|
||||
"details."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:458
|
||||
msgid "Auth: Requesting CHALLENGE..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:462
|
||||
msgid "Auth: Sending AUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:479
|
||||
msgid "Auth: Received challenge, sending CHALLENGEAUTH request..."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:521
|
||||
msgid "Authentication failed: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:525
|
||||
msgid "Authentication successful: {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:539
|
||||
msgid ""
|
||||
"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back "
|
||||
"to standard AUTH."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:566
|
||||
msgid "RequestPerms: Requesting op on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:579
|
||||
msgid "RequestPerms: Requesting voice on {1}"
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:686
|
||||
msgid "Please provide your username and password for Q."
|
||||
msgstr ""
|
||||
|
||||
#: q.cpp:689
|
||||
msgid "Auths you with QuakeNet's Q bot."
|
||||
msgstr ""
|
||||
689
modules/q.cpp
689
modules/q.cpp
@@ -1,689 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2019 ZNC, see the NOTICE file for details.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <znc/User.h>
|
||||
#include <znc/IRCNetwork.h>
|
||||
#include <znc/IRCSock.h>
|
||||
#include <znc/Chan.h>
|
||||
|
||||
using std::set;
|
||||
|
||||
#ifndef Q_DEBUG_COMMUNICATION
|
||||
#define Q_DEBUG_COMMUNICATION 0
|
||||
#endif
|
||||
|
||||
class CQModule : public CModule {
|
||||
public:
|
||||
MODCONSTRUCTOR(CQModule) {}
|
||||
~CQModule() override {}
|
||||
|
||||
bool OnLoad(const CString& sArgs, CString& sMessage) override {
|
||||
if (!sArgs.empty()) {
|
||||
SetUsername(sArgs.Token(0));
|
||||
SetPassword(sArgs.Token(1));
|
||||
} else {
|
||||
m_sUsername = GetNV("Username");
|
||||
m_sPassword = GetNV("Password");
|
||||
}
|
||||
|
||||
CString sTmp;
|
||||
m_bUseCloakedHost =
|
||||
(sTmp = GetNV("UseCloakedHost")).empty() ? true : sTmp.ToBool();
|
||||
m_bUseChallenge =
|
||||
(sTmp = GetNV("UseChallenge")).empty() ? true : sTmp.ToBool();
|
||||
m_bRequestPerms = GetNV("RequestPerms").ToBool();
|
||||
m_bJoinOnInvite =
|
||||
(sTmp = GetNV("JoinOnInvite")).empty() ? true : sTmp.ToBool();
|
||||
m_bJoinAfterCloaked =
|
||||
(sTmp = GetNV("JoinAfterCloaked")).empty() ? true : sTmp.ToBool();
|
||||
|
||||
// Make sure NVs are stored in config. Note: SetUseCloakedHost() is
|
||||
// called further down.
|
||||
SetUseChallenge(m_bUseChallenge);
|
||||
SetRequestPerms(m_bRequestPerms);
|
||||
SetJoinOnInvite(m_bJoinOnInvite);
|
||||
SetJoinAfterCloaked(m_bJoinAfterCloaked);
|
||||
|
||||
OnIRCDisconnected(); // reset module's state
|
||||
|
||||
if (IsIRCConnected()) {
|
||||
// check for usermode +x if we are already connected
|
||||
set<char> scUserModes =
|
||||
GetNetwork()->GetIRCSock()->GetUserModes();
|
||||
if (scUserModes.find('x') != scUserModes.end()) m_bCloaked = true;
|
||||
|
||||
// This will only happen once, and only if the user loads the module
|
||||
// after connecting to IRC.
|
||||
// Also don't notify the user in case he already had mode +x set.
|
||||
if (GetNV("UseCloakedHost").empty()) {
|
||||
if (!m_bCloaked)
|
||||
PutModule(t_s(
|
||||
"Notice: Your host will be cloaked the next time you "
|
||||
"reconnect to IRC. "
|
||||
"If you want to cloak your host now, /msg *q Cloak. "
|
||||
"You can set your preference "
|
||||
"with /msg *q Set UseCloakedHost true/false."));
|
||||
m_bUseCloakedHost = true;
|
||||
SetUseCloakedHost(m_bUseCloakedHost);
|
||||
m_bJoinAfterCloaked = true;
|
||||
SetJoinAfterCloaked(m_bJoinAfterCloaked);
|
||||
} else if (m_bUseChallenge) {
|
||||
Cloak();
|
||||
}
|
||||
WhoAmI();
|
||||
} else {
|
||||
SetUseCloakedHost(m_bUseCloakedHost);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnIRCDisconnected() override {
|
||||
m_bCloaked = false;
|
||||
m_bAuthed = false;
|
||||
m_bRequestedWhoami = false;
|
||||
m_bRequestedChallenge = false;
|
||||
m_bCatchResponse = false;
|
||||
}
|
||||
|
||||
void OnIRCConnected() override {
|
||||
if (m_bUseCloakedHost) Cloak();
|
||||
WhoAmI();
|
||||
}
|
||||
|
||||
void OnModCommand(const CString& sLine) override {
|
||||
CString sCommand = sLine.Token(0).AsLower();
|
||||
|
||||
if (sCommand == "help") {
|
||||
PutModule(t_s("The following commands are available:"));
|
||||
CTable Table;
|
||||
Table.AddColumn(t_s("Command"));
|
||||
Table.AddColumn(t_s("Description"));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command"), t_s("Auth [<username> <password>]"));
|
||||
Table.SetCell(t_s("Description"),
|
||||
t_s("Tries to authenticate you with Q. Both "
|
||||
"parameters are optional."));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command"), "Cloak");
|
||||
Table.SetCell(
|
||||
t_s("Description"),
|
||||
t_s("Tries to set usermode +x to hide your real hostname."));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command"), "Status");
|
||||
Table.SetCell(t_s("Description"),
|
||||
t_s("Prints the current status of the module."));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command"), "Update");
|
||||
Table.SetCell(
|
||||
t_s("Description"),
|
||||
t_s("Re-requests the current user information from Q."));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command"), t_s("Set <setting> <value>"));
|
||||
Table.SetCell(t_s("Description"),
|
||||
t_s("Changes the value of the given setting. See the "
|
||||
"list of settings below."));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command"), "Get");
|
||||
Table.SetCell(t_s("Description"),
|
||||
t_s("Prints out the current configuration. See the "
|
||||
"list of settings below."));
|
||||
PutModule(Table);
|
||||
|
||||
PutModule(t_s("The following settings are available:"));
|
||||
CTable Table2;
|
||||
Table2.AddColumn(t_s("Setting"));
|
||||
Table2.AddColumn(t_s("Type"));
|
||||
Table2.AddColumn(t_s("Description"));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"),"Username");
|
||||
Table2.SetCell(t_s("Type"), t_s("String"));
|
||||
Table2.SetCell(t_s("Description"), t_s("Your Q username."));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"), "Password");
|
||||
Table2.SetCell(t_s("Type"), t_s("String"));
|
||||
Table2.SetCell(t_s("Description"), t_s("Your Q password."));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"), "UseCloakedHost");
|
||||
Table2.SetCell(t_s("Type"), t_s("Boolean"));
|
||||
Table2.SetCell(t_s("Description"),
|
||||
t_s("Whether to cloak your hostname (+x) "
|
||||
"automatically on connect."));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"), "UseChallenge");
|
||||
Table2.SetCell(t_s("Type"), t_s("Boolean"));
|
||||
Table2.SetCell(t_s("Description"),
|
||||
t_s("Whether to use the CHALLENGEAUTH mechanism to "
|
||||
"avoid sending passwords in cleartext."));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"), "RequestPerms");
|
||||
Table2.SetCell(t_s("Type"), t_s("Boolean"));
|
||||
Table2.SetCell(t_s("Description"),
|
||||
t_s("Whether to request voice/op from Q on "
|
||||
"join/devoice/deop."));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"), "JoinOnInvite");
|
||||
Table2.SetCell(t_s("Type"), t_s("Boolean"));
|
||||
Table2.SetCell(t_s("Description"),
|
||||
t_s("Whether to join channels when Q invites you."));
|
||||
Table2.AddRow();
|
||||
Table2.SetCell(t_s("Setting"), "JoinAfterCloaked");
|
||||
Table2.SetCell(t_s("Type"), t_s("Boolean"));
|
||||
Table2.SetCell(
|
||||
t_s("Description"),
|
||||
t_s("Whether to delay joining channels until after you "
|
||||
"are cloaked."));
|
||||
PutModule(Table2);
|
||||
|
||||
PutModule(
|
||||
t_s("This module takes 2 optional parameters: <username> "
|
||||
"<password>"));
|
||||
PutModule(t_s("Module settings are stored between restarts."));
|
||||
|
||||
} else if (sCommand == "set") {
|
||||
CString sSetting = sLine.Token(1).AsLower();
|
||||
CString sValue = sLine.Token(2);
|
||||
if (sSetting.empty() || sValue.empty()) {
|
||||
PutModule(t_s("Syntax: Set <setting> <value>"));
|
||||
} else if (sSetting == "username") {
|
||||
SetUsername(sValue);
|
||||
PutModule(t_s("Username set"));
|
||||
} else if (sSetting == "password") {
|
||||
SetPassword(sValue);
|
||||
PutModule(t_s("Password set"));
|
||||
} else if (sSetting == "usecloakedhost") {
|
||||
SetUseCloakedHost(sValue.ToBool());
|
||||
PutModule(t_s("UseCloakedHost set"));
|
||||
} else if (sSetting == "usechallenge") {
|
||||
SetUseChallenge(sValue.ToBool());
|
||||
PutModule(t_s("UseChallenge set"));
|
||||
} else if (sSetting == "requestperms") {
|
||||
SetRequestPerms(sValue.ToBool());
|
||||
PutModule(t_s("RequestPerms set"));
|
||||
} else if (sSetting == "joinoninvite") {
|
||||
SetJoinOnInvite(sValue.ToBool());
|
||||
PutModule(t_s("JoinOnInvite set"));
|
||||
} else if (sSetting == "joinaftercloaked") {
|
||||
SetJoinAfterCloaked(sValue.ToBool());
|
||||
PutModule(t_s("JoinAfterCloaked set"));
|
||||
} else
|
||||
PutModule(t_f("Unknown setting: {1}")(sSetting));
|
||||
|
||||
} else if (sCommand == "get" || sCommand == "list") {
|
||||
CTable Table;
|
||||
Table.AddColumn(t_s("Setting"));
|
||||
Table.AddColumn(t_s("Value"));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "Username");
|
||||
Table.SetCell(t_s("Value"), m_sUsername);
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "Password");
|
||||
Table.SetCell(t_s("Value"), "*****"); // m_sPassword
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "UseCloakedHost");
|
||||
Table.SetCell(t_s("Value"), CString(m_bUseCloakedHost));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "UseChallenge");
|
||||
Table.SetCell(t_s("Value"), CString(m_bUseChallenge));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "RequestPerms");
|
||||
Table.SetCell(t_s("Value"), CString(m_bRequestPerms));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "JoinOnInvite");
|
||||
Table.SetCell(t_s("Value"), CString(m_bJoinOnInvite));
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Setting"), "JoinAfterCloaked");
|
||||
Table.SetCell(t_s("Value"), CString(m_bJoinAfterCloaked));
|
||||
PutModule(Table);
|
||||
|
||||
} else if (sCommand == "status") {
|
||||
PutModule(IsIRCConnected() ? t_s("Connected: yes")
|
||||
: t_s("Connected: no"));
|
||||
PutModule(m_bCloaked ? t_s("Cloacked: yes") : t_s("Cloacked: no"));
|
||||
PutModule(m_bAuthed ? t_s("Authenticated: yes")
|
||||
: t_s("Authenticated: no"));
|
||||
|
||||
} else {
|
||||
// The following commands require an IRC connection.
|
||||
if (!IsIRCConnected()) {
|
||||
PutModule(t_s("Error: You are not connected to IRC."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (sCommand == "cloak") {
|
||||
if (!m_bCloaked)
|
||||
Cloak();
|
||||
else
|
||||
PutModule(t_s("Error: You are already cloaked!"));
|
||||
|
||||
} else if (sCommand == "auth") {
|
||||
if (!m_bAuthed)
|
||||
Auth(sLine.Token(1), sLine.Token(2));
|
||||
else
|
||||
PutModule(t_s("Error: You are already authed!"));
|
||||
|
||||
} else if (sCommand == "update") {
|
||||
WhoAmI();
|
||||
PutModule(t_s("Update requested."));
|
||||
|
||||
} else {
|
||||
PutModule(t_s("Unknown command. Try 'help'."));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EModRet OnRaw(CString& sLine) override {
|
||||
// use OnRaw because OnUserMode is not defined (yet?)
|
||||
if (sLine.Token(1) == "396" &&
|
||||
sLine.Token(3).find("users.quakenet.org") != CString::npos) {
|
||||
m_bCloaked = true;
|
||||
PutModule(t_s("Cloak successful: Your hostname is now cloaked."));
|
||||
|
||||
// Join channels immediately after our spoof is set, but only if
|
||||
// both UseCloakedHost and JoinAfterCloaked is enabled. See #602.
|
||||
if (m_bJoinAfterCloaked) {
|
||||
GetNetwork()->JoinChans();
|
||||
}
|
||||
}
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
EModRet OnPrivMsg(CNick& Nick, CString& sMessage) override {
|
||||
return HandleMessage(Nick, sMessage);
|
||||
}
|
||||
|
||||
EModRet OnPrivNotice(CNick& Nick, CString& sMessage) override {
|
||||
return HandleMessage(Nick, sMessage);
|
||||
}
|
||||
|
||||
EModRet OnJoining(CChan& Channel) override {
|
||||
// Halt if are not already cloaked, but the user requres that we delay
|
||||
// channel join till after we are cloaked.
|
||||
if (!m_bCloaked && m_bUseCloakedHost && m_bJoinAfterCloaked)
|
||||
return HALT;
|
||||
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
void OnJoin(const CNick& Nick, CChan& Channel) override {
|
||||
if (m_bRequestPerms && IsSelf(Nick)) HandleNeed(Channel, "ov");
|
||||
}
|
||||
|
||||
void OnDeop2(const CNick* pOpNick, const CNick& Nick, CChan& Channel,
|
||||
bool bNoChange) override {
|
||||
if (m_bRequestPerms && IsSelf(Nick) && (!pOpNick || !IsSelf(*pOpNick)))
|
||||
HandleNeed(Channel, "o");
|
||||
}
|
||||
|
||||
void OnDevoice2(const CNick* pOpNick, const CNick& Nick, CChan& Channel,
|
||||
bool bNoChange) override {
|
||||
if (m_bRequestPerms && IsSelf(Nick) && (!pOpNick || !IsSelf(*pOpNick)))
|
||||
HandleNeed(Channel, "v");
|
||||
}
|
||||
|
||||
EModRet OnInvite(const CNick& Nick, const CString& sChan) override {
|
||||
if (!Nick.NickEquals("Q") ||
|
||||
!Nick.GetHost().Equals("CServe.quakenet.org"))
|
||||
return CONTINUE;
|
||||
if (m_bJoinOnInvite) GetNetwork()->AddChan(sChan, false);
|
||||
return CONTINUE;
|
||||
}
|
||||
|
||||
CString GetWebMenuTitle() override { return "Q"; }
|
||||
|
||||
bool OnWebRequest(CWebSock& WebSock, const CString& sPageName,
|
||||
CTemplate& Tmpl) override {
|
||||
if (sPageName == "index") {
|
||||
bool bSubmitted = (WebSock.GetParam("submitted").ToInt() != 0);
|
||||
|
||||
if (bSubmitted) {
|
||||
CString FormUsername = WebSock.GetParam("user");
|
||||
if (!FormUsername.empty()) SetUsername(FormUsername);
|
||||
|
||||
CString FormPassword = WebSock.GetParam("password");
|
||||
if (!FormPassword.empty()) SetPassword(FormPassword);
|
||||
|
||||
SetUseCloakedHost(WebSock.GetParam("usecloakedhost").ToBool());
|
||||
SetUseChallenge(WebSock.GetParam("usechallenge").ToBool());
|
||||
SetRequestPerms(WebSock.GetParam("requestperms").ToBool());
|
||||
SetJoinOnInvite(WebSock.GetParam("joinoninvite").ToBool());
|
||||
SetJoinAfterCloaked(
|
||||
WebSock.GetParam("joinaftercloaked").ToBool());
|
||||
}
|
||||
|
||||
Tmpl["Username"] = m_sUsername;
|
||||
|
||||
CTemplate& o1 = Tmpl.AddRow("OptionLoop");
|
||||
o1["Name"] = "usecloakedhost";
|
||||
o1["DisplayName"] = "UseCloakedHost";
|
||||
o1["Tooltip"] =
|
||||
t_s("Whether to cloak your hostname (+x) automatically on "
|
||||
"connect.");
|
||||
o1["Checked"] = CString(m_bUseCloakedHost);
|
||||
|
||||
CTemplate& o2 = Tmpl.AddRow("OptionLoop");
|
||||
o2["Name"] = "usechallenge";
|
||||
o2["DisplayName"] = "UseChallenge";
|
||||
o2["Tooltip"] =
|
||||
t_s("Whether to use the CHALLENGEAUTH mechanism to avoid "
|
||||
"sending passwords in cleartext.");
|
||||
o2["Checked"] = CString(m_bUseChallenge);
|
||||
|
||||
CTemplate& o3 = Tmpl.AddRow("OptionLoop");
|
||||
o3["Name"] = "requestperms";
|
||||
o3["DisplayName"] = "RequestPerms";
|
||||
o3["Tooltip"] =
|
||||
t_s("Whether to request voice/op from Q on join/devoice/deop.");
|
||||
o3["Checked"] = CString(m_bRequestPerms);
|
||||
|
||||
CTemplate& o4 = Tmpl.AddRow("OptionLoop");
|
||||
o4["Name"] = "joinoninvite";
|
||||
o4["DisplayName"] = "JoinOnInvite";
|
||||
o4["Tooltip"] = t_s("Whether to join channels when Q invites you.");
|
||||
o4["Checked"] = CString(m_bJoinOnInvite);
|
||||
|
||||
CTemplate& o5 = Tmpl.AddRow("OptionLoop");
|
||||
o5["Name"] = "joinaftercloaked";
|
||||
o5["DisplayName"] = "JoinAfterCloaked";
|
||||
o5["Tooltip"] =
|
||||
t_s("Whether to delay joining channels until after you are "
|
||||
"cloaked.");
|
||||
o5["Checked"] = CString(m_bJoinAfterCloaked);
|
||||
|
||||
if (bSubmitted) {
|
||||
WebSock.GetSession()->AddSuccess(
|
||||
t_s("Changes have been saved!"));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_bCloaked{};
|
||||
bool m_bAuthed{};
|
||||
bool m_bRequestedWhoami{};
|
||||
bool m_bRequestedChallenge{};
|
||||
bool m_bCatchResponse{};
|
||||
MCString m_msChanModes;
|
||||
|
||||
void PutQ(const CString& sMessage) {
|
||||
PutIRC("PRIVMSG Q@CServe.quakenet.org :" + sMessage);
|
||||
#if Q_DEBUG_COMMUNICATION
|
||||
PutModule("[ZNC --> Q] " + sMessage);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Cloak() {
|
||||
if (m_bCloaked) return;
|
||||
|
||||
PutModule(t_s("Cloak: Trying to cloak your hostname, setting +x..."));
|
||||
PutIRC("MODE " + GetNetwork()->GetIRCSock()->GetNick() + " +x");
|
||||
}
|
||||
|
||||
void WhoAmI() {
|
||||
m_bRequestedWhoami = true;
|
||||
PutQ("WHOAMI");
|
||||
}
|
||||
|
||||
void Auth(const CString& sUsername = "", const CString& sPassword = "") {
|
||||
if (m_bAuthed) return;
|
||||
|
||||
if (!sUsername.empty()) SetUsername(sUsername);
|
||||
if (!sPassword.empty()) SetPassword(sPassword);
|
||||
|
||||
if (m_sUsername.empty() || m_sPassword.empty()) {
|
||||
PutModule(
|
||||
t_s("You have to set a username and password to use this "
|
||||
"module! See 'help' for details."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_bUseChallenge) {
|
||||
PutModule(t_s("Auth: Requesting CHALLENGE..."));
|
||||
m_bRequestedChallenge = true;
|
||||
PutQ("CHALLENGE");
|
||||
} else {
|
||||
PutModule(t_s("Auth: Sending AUTH request..."));
|
||||
PutQ("AUTH " + m_sUsername + " " + m_sPassword);
|
||||
}
|
||||
}
|
||||
|
||||
void ChallengeAuth(CString sChallenge) {
|
||||
if (m_bAuthed) return;
|
||||
|
||||
CString sUsername = m_sUsername.AsLower()
|
||||
.Replace_n("[", "{")
|
||||
.Replace_n("]", "}")
|
||||
.Replace_n("\\", "|");
|
||||
CString sPasswordHash = m_sPassword.Left(10).SHA256();
|
||||
CString sKey = CString(sUsername + ":" + sPasswordHash).SHA256();
|
||||
CString sResponse = HMAC_SHA256(sKey, sChallenge);
|
||||
|
||||
PutModule(
|
||||
t_s("Auth: Received challenge, sending CHALLENGEAUTH request..."));
|
||||
PutQ("CHALLENGEAUTH " + m_sUsername + " " + sResponse +
|
||||
" HMAC-SHA-256");
|
||||
}
|
||||
|
||||
EModRet HandleMessage(const CNick& Nick, CString sMessage) {
|
||||
if (!Nick.NickEquals("Q") ||
|
||||
!Nick.GetHost().Equals("CServe.quakenet.org"))
|
||||
return CONTINUE;
|
||||
|
||||
sMessage.Trim();
|
||||
|
||||
#if Q_DEBUG_COMMUNICATION
|
||||
PutModule("[ZNC <-- Q] " + sMessage);
|
||||
#endif
|
||||
|
||||
// WHOAMI
|
||||
if (sMessage.find("WHOAMI is only available to authed users") !=
|
||||
CString::npos) {
|
||||
m_bAuthed = false;
|
||||
Auth();
|
||||
m_bCatchResponse = m_bRequestedWhoami;
|
||||
} else if (sMessage.find("Information for user") != CString::npos) {
|
||||
m_bAuthed = true;
|
||||
m_msChanModes.clear();
|
||||
m_bCatchResponse = m_bRequestedWhoami;
|
||||
m_bRequestedWhoami = true;
|
||||
} else if (m_bRequestedWhoami && sMessage.WildCmp("#*")) {
|
||||
CString sChannel = sMessage.Token(0);
|
||||
CString sFlags = sMessage.Token(1, true).Trim_n().TrimLeft_n("+");
|
||||
m_msChanModes[sChannel] = sFlags;
|
||||
} else if (m_bRequestedWhoami && m_bCatchResponse &&
|
||||
(sMessage.Equals("End of list.") ||
|
||||
sMessage.Equals(
|
||||
"account, or HELLO to create an account."))) {
|
||||
m_bRequestedWhoami = m_bCatchResponse = false;
|
||||
return HALT;
|
||||
}
|
||||
|
||||
// AUTH
|
||||
else if (sMessage.Equals("Username or password incorrect.")) {
|
||||
m_bAuthed = false;
|
||||
PutModule(t_f("Authentication failed: {1}")(sMessage));
|
||||
return HALT;
|
||||
} else if (sMessage.WildCmp("You are now logged in as *.")) {
|
||||
m_bAuthed = true;
|
||||
PutModule(t_f("Authentication successful: {1}")(sMessage));
|
||||
WhoAmI();
|
||||
return HALT;
|
||||
} else if (m_bRequestedChallenge &&
|
||||
sMessage.Token(0).Equals("CHALLENGE")) {
|
||||
m_bRequestedChallenge = false;
|
||||
if (sMessage.find("not available once you have authed") !=
|
||||
CString::npos) {
|
||||
m_bAuthed = true;
|
||||
} else {
|
||||
if (sMessage.find("HMAC-SHA-256") != CString::npos) {
|
||||
ChallengeAuth(sMessage.Token(1));
|
||||
} else {
|
||||
PutModule(
|
||||
t_s("Auth failed: Q does not support HMAC-SHA-256 for "
|
||||
"CHALLENGEAUTH, falling back to standard AUTH."));
|
||||
SetUseChallenge(false);
|
||||
Auth();
|
||||
}
|
||||
}
|
||||
return HALT;
|
||||
}
|
||||
|
||||
// prevent buffering of Q's responses
|
||||
return !m_bCatchResponse && GetUser()->IsUserAttached() ? CONTINUE
|
||||
: HALT;
|
||||
}
|
||||
|
||||
void HandleNeed(const CChan& Channel, const CString& sPerms) {
|
||||
MCString::iterator it = m_msChanModes.find(Channel.GetName());
|
||||
if (it == m_msChanModes.end()) return;
|
||||
CString sModes = it->second;
|
||||
|
||||
bool bMaster = (sModes.find("m") != CString::npos) ||
|
||||
(sModes.find("n") != CString::npos);
|
||||
|
||||
if (sPerms.find("o") != CString::npos) {
|
||||
bool bOp = (sModes.find("o") != CString::npos);
|
||||
bool bAutoOp = (sModes.find("a") != CString::npos);
|
||||
if (bMaster || bOp) {
|
||||
if (!bAutoOp) {
|
||||
PutModule(t_f("RequestPerms: Requesting op on {1}")(
|
||||
Channel.GetName()));
|
||||
PutQ("OP " + Channel.GetName());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (sPerms.find("v") != CString::npos) {
|
||||
bool bVoice = (sModes.find("v") != CString::npos);
|
||||
bool bAutoVoice = (sModes.find("g") != CString::npos);
|
||||
if (bMaster || bVoice) {
|
||||
if (!bAutoVoice) {
|
||||
PutModule(t_f("RequestPerms: Requesting voice on {1}")(
|
||||
Channel.GetName()));
|
||||
PutQ("VOICE " + Channel.GetName());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Utility Functions */
|
||||
bool IsIRCConnected() {
|
||||
CIRCSock* pIRCSock = GetNetwork()->GetIRCSock();
|
||||
return pIRCSock && pIRCSock->IsAuthed();
|
||||
}
|
||||
|
||||
bool IsSelf(const CNick& Nick) {
|
||||
return Nick.NickEquals(GetNetwork()->GetCurNick());
|
||||
}
|
||||
|
||||
bool PackHex(const CString& sHex, CString& sPackedHex) {
|
||||
if (sHex.length() % 2) return false;
|
||||
|
||||
sPackedHex.clear();
|
||||
|
||||
CString::size_type len = sHex.length() / 2;
|
||||
for (CString::size_type i = 0; i < len; i++) {
|
||||
unsigned int value;
|
||||
int n = sscanf(&sHex[i * 2], "%02x", &value);
|
||||
if (n != 1 || value > 0xff) return false;
|
||||
sPackedHex += (unsigned char)value;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CString HMAC_SHA256(const CString& sKey, const CString& sData) {
|
||||
CString sRealKey;
|
||||
if (sKey.length() > 64)
|
||||
PackHex(sKey.SHA256(), sRealKey);
|
||||
else
|
||||
sRealKey = sKey;
|
||||
|
||||
CString sOuterKey, sInnerKey;
|
||||
CString::size_type iKeyLength = sRealKey.length();
|
||||
for (unsigned int i = 0; i < 64; i++) {
|
||||
char r = (i < iKeyLength ? sRealKey[i] : '\0');
|
||||
sOuterKey += r ^ 0x5c;
|
||||
sInnerKey += r ^ 0x36;
|
||||
}
|
||||
|
||||
CString sInnerHash;
|
||||
PackHex(CString(sInnerKey + sData).SHA256(), sInnerHash);
|
||||
return CString(sOuterKey + sInnerHash).SHA256();
|
||||
}
|
||||
|
||||
/* Settings */
|
||||
CString m_sUsername;
|
||||
CString m_sPassword;
|
||||
bool m_bUseCloakedHost{};
|
||||
bool m_bUseChallenge{};
|
||||
bool m_bRequestPerms{};
|
||||
bool m_bJoinOnInvite{};
|
||||
bool m_bJoinAfterCloaked{};
|
||||
|
||||
void SetUsername(const CString& sUsername) {
|
||||
m_sUsername = sUsername;
|
||||
SetNV("Username", sUsername);
|
||||
}
|
||||
|
||||
void SetPassword(const CString& sPassword) {
|
||||
m_sPassword = sPassword;
|
||||
SetNV("Password", sPassword);
|
||||
}
|
||||
|
||||
void SetUseCloakedHost(const bool bUseCloakedHost) {
|
||||
m_bUseCloakedHost = bUseCloakedHost;
|
||||
SetNV("UseCloakedHost", CString(bUseCloakedHost));
|
||||
|
||||
if (!m_bCloaked && m_bUseCloakedHost && IsIRCConnected()) Cloak();
|
||||
}
|
||||
|
||||
void SetUseChallenge(const bool bUseChallenge) {
|
||||
m_bUseChallenge = bUseChallenge;
|
||||
SetNV("UseChallenge", CString(bUseChallenge));
|
||||
}
|
||||
|
||||
void SetRequestPerms(const bool bRequestPerms) {
|
||||
m_bRequestPerms = bRequestPerms;
|
||||
SetNV("RequestPerms", CString(bRequestPerms));
|
||||
}
|
||||
|
||||
void SetJoinOnInvite(const bool bJoinOnInvite) {
|
||||
m_bJoinOnInvite = bJoinOnInvite;
|
||||
SetNV("JoinOnInvite", CString(bJoinOnInvite));
|
||||
}
|
||||
|
||||
void SetJoinAfterCloaked(const bool bJoinAfterCloaked) {
|
||||
m_bJoinAfterCloaked = bJoinAfterCloaked;
|
||||
SetNV("JoinAfterCloaked", CString(bJoinAfterCloaked));
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
void TModInfo<CQModule>(CModInfo& Info) {
|
||||
Info.SetWikiPage("Q");
|
||||
Info.SetHasArgs(true);
|
||||
Info.SetArgsHelpText(
|
||||
Info.t_s("Please provide your username and password for Q."));
|
||||
}
|
||||
|
||||
NETWORKMODULEDEFS(CQModule, t_s("Auths you with QuakeNet's Q bot."))
|
||||
@@ -25,7 +25,7 @@ struct reply {
|
||||
// TODO this list is far from complete, no errors are handled
|
||||
static const struct {
|
||||
const char* szRequest;
|
||||
struct reply vReplies[19];
|
||||
struct reply vReplies[20];
|
||||
} vRouteReplies[] = {
|
||||
{"WHO",
|
||||
{{"402", true}, /* rfc1459 ERR_NOSUCHSERVER */
|
||||
@@ -44,8 +44,8 @@ static const struct {
|
||||
{
|
||||
{"353", false}, /* rfc1459 RPL_NAMREPLY */
|
||||
{"366", true}, /* rfc1459 RPL_ENDOFNAMES */
|
||||
// No such nick/channel
|
||||
{"401", true},
|
||||
{"401", true}, /* rfc1459 ERR_NOSUCHNICK */
|
||||
{"403", true}, /* rfc1459 ERR_NOSUCHCHANNEL */
|
||||
{nullptr, true},
|
||||
}},
|
||||
{"LUSERS",
|
||||
@@ -65,11 +65,12 @@ static const struct {
|
||||
{"313", false}, /* rfc1459 RPL_WHOISOPERATOR */
|
||||
{"317", false}, /* rfc1459 RPL_WHOISIDLE */
|
||||
{"319", false}, /* rfc1459 RPL_WHOISCHANNELS */
|
||||
{"320", false}, /* unreal RPL_WHOISSPECIAL */
|
||||
{"301", false}, /* rfc1459 RPL_AWAY */
|
||||
{"276", false}, /* oftc-hybrid RPL_WHOISCERTFP */
|
||||
{"330", false}, /* ratbox RPL_WHOISLOGGEDIN
|
||||
aka ircu RPL_WHOISACCOUNT */
|
||||
{"338", false}, /* RPL_WHOISACTUALLY -- "actually using host" */
|
||||
{"338", false}, /* ircu RPL_WHOISACTUALLY -- "actually using host" */
|
||||
{"378", false}, /* RPL_WHOISHOST -- real address of vhosts */
|
||||
{"671", false}, /* RPL_WHOISSECURE */
|
||||
{"307", false}, /* RPL_WHOISREGNICK */
|
||||
@@ -97,6 +98,9 @@ static const struct {
|
||||
{{"406", false}, /* rfc1459 ERR_WASNOSUCHNICK */
|
||||
{"312", false}, /* rfc1459 RPL_WHOISSERVER */
|
||||
{"314", false}, /* rfc1459 RPL_WHOWASUSER */
|
||||
{"330", false}, /* ratbox RPL_WHOISLOGGEDIN
|
||||
aka ircu RPL_WHOISACCOUNT */
|
||||
{"338", false}, /* ircu RPL_WHOISACTUALLY -- "actually using host" */
|
||||
{"369", true}, /* rfc1459 RPL_ENDOFWHOWAS */
|
||||
{"431", true}, /* rfc1459 ERR_NONICKNAMEGIVEN */
|
||||
{nullptr, true}}},
|
||||
|
||||
@@ -1658,6 +1658,7 @@ void CClient::HelpUser(const CString& sFilter) {
|
||||
CTable Table;
|
||||
Table.AddColumn(t_s("Command", "helpcmd"));
|
||||
Table.AddColumn(t_s("Description", "helpcmd"));
|
||||
Table.SetStyle(CTable::ListStyle);
|
||||
|
||||
if (sFilter.empty()) {
|
||||
PutStatus(
|
||||
@@ -1670,7 +1671,8 @@ void CClient::HelpUser(const CString& sFilter) {
|
||||
if (sFilter.empty() || sCmd.StartsWith(sFilter) ||
|
||||
sCmd.AsLower().WildCmp(sFilter.AsLower())) {
|
||||
Table.AddRow();
|
||||
Table.SetCell(t_s("Command", "helpcmd"), sCmd + " " + sArgs);
|
||||
Table.SetCell(t_s("Command", "helpcmd"),
|
||||
sCmd + (sArgs.empty() ? "" : " ") + sArgs);
|
||||
Table.SetCell(t_s("Description", "helpcmd"), sDesc);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -456,6 +456,35 @@ bool CIRCNetwork::ParseConfig(CConfig* pConfig, CString& sError,
|
||||
bool bModRet = LoadModule(sModName, sArgs, sNotice, sModRet);
|
||||
|
||||
if (!bModRet) {
|
||||
// Q is removed in znc 1.8
|
||||
if (sModName == "q") {
|
||||
CUtils::PrintError(
|
||||
"NOTICE: [q] is unavailable, cannot load.");
|
||||
CUtils::PrintError(
|
||||
"NOTICE: [q] is removed in this release of ZNC. Please "
|
||||
"either remove it from your config or install it as a "
|
||||
"third party module with the same name.");
|
||||
CUtils::PrintError(
|
||||
"NOTICE: More info can be found on "
|
||||
"https://wiki.znc.in/Q");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Partyline is removed in znc 1.8
|
||||
if (sModName == "partyline") {
|
||||
CUtils::PrintError(
|
||||
"NOTICE: [partyline] is unavailable, cannot load.");
|
||||
CUtils::PrintError(
|
||||
"NOTICE: [partyline] is removed in this release"
|
||||
" of ZNC. Please either remove it from your config or "
|
||||
"install it as a third party module with the same "
|
||||
"name.");
|
||||
CUtils::PrintError(
|
||||
"NOTICE: More info can be found on "
|
||||
"https://wiki.znc.in/Partyline");
|
||||
return false;
|
||||
}
|
||||
|
||||
// XXX The awaynick module was retired in 1.6 (still available
|
||||
// as external module)
|
||||
if (sModName == "awaynick") {
|
||||
|
||||
@@ -760,6 +760,8 @@ void CUtils::SetMessageTags(CString& sLine, const MCString& mssTags) {
|
||||
}
|
||||
|
||||
bool CTable::AddColumn(const CString& sName) {
|
||||
if (eStyle == ListStyle && m_vsHeaders.size() >= 2)
|
||||
return false;
|
||||
for (const CString& sHeader : m_vsHeaders) {
|
||||
if (sHeader.Equals(sName)) {
|
||||
return false;
|
||||
@@ -772,6 +774,19 @@ bool CTable::AddColumn(const CString& sName) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CTable::SetStyle(EStyle eNewStyle) {
|
||||
switch (eNewStyle) {
|
||||
case GridStyle:
|
||||
break;
|
||||
case ListStyle:
|
||||
if (m_vsHeaders.size() > 2) return false;
|
||||
break;
|
||||
}
|
||||
|
||||
eStyle = eNewStyle;
|
||||
return true;
|
||||
}
|
||||
|
||||
CTable::size_type CTable::AddRow() {
|
||||
// Don't add a row if no headers are defined
|
||||
if (m_vsHeaders.empty()) {
|
||||
@@ -812,6 +827,20 @@ bool CTable::GetLine(unsigned int uIdx, CString& sLine) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (eStyle == ListStyle) {
|
||||
if (m_vsHeaders.size() > 2) return false; // definition list mode can only do up to two columns
|
||||
if (uIdx >= size()) return false;
|
||||
|
||||
const std::vector<CString>& mRow = (*this)[uIdx];
|
||||
ssRet << "\x02" << mRow[0] << "\x0f"; //bold first column
|
||||
if (m_vsHeaders.size() >= 2 && mRow[1] != "") {
|
||||
ssRet << ": " << mRow[1];
|
||||
}
|
||||
|
||||
sLine = ssRet.str();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (uIdx == 1) {
|
||||
ssRet.fill(' ');
|
||||
ssRet << "| ";
|
||||
|
||||
Reference in New Issue
Block a user