summaryrefslogtreecommitdiff
path: root/src/helperfuncs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/helperfuncs.cpp')
-rw-r--r--src/helperfuncs.cpp190
1 files changed, 182 insertions, 8 deletions
diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp
index c358b4bf5..c2a323a7c 100644
--- a/src/helperfuncs.cpp
+++ b/src/helperfuncs.cpp
@@ -123,7 +123,7 @@ void readfile(file_cache &F, const char* fname)
log(DEBUG,"readfile: loaded %s, %lu lines",fname,(unsigned long)F.size());
}
-void Write_NoFormat(int sock,char *text)
+void Write_NoFormat(int sock, const char *text)
{
if ((sock < 0) || (!text))
return;
@@ -177,7 +177,7 @@ void Write(int sock,char *text, ...)
else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
}
-void WriteServ_NoFormat(int sock, char* text)
+void WriteServ_NoFormat(int sock, const char* text)
{
if ((sock < 0) || (!text))
return;
@@ -232,7 +232,7 @@ void WriteServ(int sock, char* text, ...)
else log(DEFAULT,"ERROR! attempted write to a user with no fd_ref_table entry!!!");
}
-void WriteFrom_NoFormat(int sock, userrec *user,char* text)
+void WriteFrom_NoFormat(int sock, userrec *user, const char* text)
{
if ((sock < 0) || (!text) || (!user))
return;
@@ -316,7 +316,7 @@ void WriteTo(userrec *source, userrec *dest,char *data, ...)
}
}
-void WriteTo_NoFormat(userrec *source, userrec *dest,char *data)
+void WriteTo_NoFormat(userrec *source, userrec *dest, const char *data)
{
if ((!dest) || (!data))
return;
@@ -357,6 +357,25 @@ void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...)
}
}
+void WriteChannel_NoFormat(chanrec* Ptr, userrec* user, const char* text)
+{
+ if ((!Ptr) || (!user) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
+ return;
+ }
+ std::vector<char*> *ulist = Ptr->GetUsers();
+ unsigned int x = ulist->size();
+ for (unsigned int j = 0; j < x; j++)
+ {
+ char* o = (*ulist)[j];
+ userrec* otheruser = (userrec*)o;
+ if (otheruser->fd != FD_MAGIC_NUMBER)
+ WriteTo_NoFormat(user,otheruser,text);
+ }
+}
+
+
/* write formatted text from a source user to all users on a channel
* including the sender (NOT for privmsg, notice etc!) doesnt send to
* users on remote servers */
@@ -380,7 +399,7 @@ void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...)
{
char* o = (*ulist)[j];
userrec* otheruser = (userrec*)o;
- if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser->fd != -1) && (otheruser != user))
+ if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser != user))
{
if (!user)
{
@@ -394,6 +413,35 @@ void WriteChannelLocal(chanrec* Ptr, userrec* user, char* text, ...)
}
}
+void WriteChannelLocal_NoFormat(chanrec* Ptr, userrec* user, const char* text)
+{
+ if ((!Ptr) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** WriteChannel was given an invalid parameter");
+ return;
+ }
+ std::vector<char*> *ulist = Ptr->GetUsers();
+ unsigned int x = ulist->size();
+ for (unsigned int j = 0; j < x; j++)
+ {
+ char* o = (*ulist)[j];
+ userrec* otheruser = (userrec*)o;
+ if ((otheruser->fd != FD_MAGIC_NUMBER) && (otheruser != user))
+ {
+ if (!user)
+ {
+ WriteServ_NoFormat(otheruser->fd,text);
+ }
+ else
+ {
+ WriteTo_NoFormat(user,otheruser,text);
+ }
+ }
+ }
+}
+
+
+
void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...)
{
if ((!Ptr) || (!text))
@@ -419,6 +467,26 @@ void WriteChannelWithServ(char* ServName, chanrec* Ptr, char* text, ...)
}
}
+void WriteChannelWithServ_NoFormat(char* ServName, chanrec* Ptr, const char* text)
+{
+ if ((!Ptr) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** WriteChannelWithServ was given an invalid parameter");
+ return;
+ }
+ std::vector<char*> *ulist = Ptr->GetUsers();
+ unsigned int x = ulist->size();
+ for (unsigned int j = 0; j < x; j++)
+ {
+ char* o = (*ulist)[j];
+ userrec* otheruser = (userrec*)o;
+ if (IS_LOCAL(otheruser))
+ WriteServ_NoFormat(otheruser->fd,text);
+ }
+}
+
+
+
/* write formatted text from a source user to all users on a channel except
* for the sender (for privmsg etc) */
@@ -446,6 +514,24 @@ void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...)
}
}
+void ChanExceptSender_NoFormat(chanrec* Ptr, userrec* user, const char* text)
+{
+ if ((!Ptr) || (!user) || (!text))
+ {
+ log(DEFAULT,"*** BUG *** ChanExceptSender was given an invalid parameter");
+ return;
+ }
+ std::vector<char*> *ulist = Ptr->GetUsers();
+ unsigned int x = ulist->size();
+ for (unsigned int j = 0; j < x; j++)
+ {
+ char* o = (*ulist)[j];
+ userrec* otheruser = (userrec*)o;
+ if ((IS_LOCAL(otheruser)) && (user != otheruser))
+ WriteFrom_NoFormat(otheruser->fd,user,text);
+ }
+}
+
std::string GetServerDescription(char* servername)
{
std::string description = "";
@@ -511,10 +597,57 @@ void WriteCommon(userrec *u, char* text, ...)
// receives their OWN message for WriteCommon
if (!sent_to_at_least_one)
{
- WriteFrom(u->fd,u,"%s",textbuffer);
+ WriteFrom_NoFormat(u->fd,u,textbuffer);
+ }
+}
+
+void WriteCommon_NoFormat(userrec *u, const char* text)
+{
+ if (!u)
+ {
+ log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
+ return;
+ }
+
+ if (u->registered != 7) {
+ log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
+ return;
+ }
+ // FIX: Stops a message going to the same person more than once
+ memset(&already_sent,0,MAX_DESCRIPTORS);
+
+ bool sent_to_at_least_one = false;
+
+ unsigned int y = u->chans.size();
+ for (unsigned int i = 0; i < y; i++)
+ {
+ if (u->chans[i].channel)
+ {
+ std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
+ unsigned int x = ulist->size();
+ for (unsigned int j = 0; j < x; j++)
+ {
+ char* o = (*ulist)[j];
+ userrec* otheruser = (userrec*)o;
+ if ((otheruser->fd > -1) && (!already_sent[otheruser->fd]))
+ {
+ already_sent[otheruser->fd] = 1;
+ WriteFrom_NoFormat(otheruser->fd,u,text);
+ sent_to_at_least_one = true;
+ }
+ }
+ }
+ }
+ // if the user was not in any channels, no users will receive the text. Make sure the user
+ // receives their OWN message for WriteCommon
+ if (!sent_to_at_least_one)
+ {
+ WriteFrom_NoFormat(u->fd,u,text);
}
}
+
+
/* write a formatted string to all users who share at least one common
* channel, NOT including the source user e.g. for use in QUIT */
@@ -563,6 +696,47 @@ void WriteCommonExcept(userrec *u, char* text, ...)
}
}
+void WriteCommonExcept_NoFormat(userrec *u, const char* text)
+{
+ if (!u)
+ {
+ log(DEFAULT,"*** BUG *** WriteCommon was given an invalid parameter");
+ return;
+ }
+
+ if (u->registered != 7) {
+ log(DEFAULT,"*** BUG *** WriteCommon on an unregistered user");
+ return;
+ }
+
+ memset(&already_sent,0,MAX_DESCRIPTORS);
+
+ unsigned int y = u->chans.size();
+ for (unsigned int i = 0; i < y; i++)
+ {
+ if (u->chans[i].channel)
+ {
+ std::vector<char*> *ulist = u->chans[i].channel->GetUsers();
+ unsigned int x = ulist->size();
+ for (unsigned int j = 0; j < x; j++)
+ {
+ char* o = (*ulist)[j];
+ userrec* otheruser = (userrec*)o;
+ if (u != otheruser)
+ {
+ if ((otheruser->fd > -1) && (!already_sent[otheruser->fd]))
+ {
+ already_sent[otheruser->fd] = 1;
+ WriteFrom_NoFormat(otheruser->fd,u,text);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+
void WriteOpers(char* text, ...)
{
if (!text)
@@ -926,14 +1100,14 @@ void userlist(userrec *user,chanrec *c)
{
/* list overflowed into
* multiple numerics */
- WriteServ(user->fd,"%s",list);
+ WriteServ_NoFormat(user->fd,list);
snprintf(list,MAXBUF,"353 %s = %s :", user->nick, c->name);
}
}
/* if whats left in the list isnt empty, send it */
if (list[strlen(list)-1] != ':')
{
- WriteServ(user->fd,"%s",list);
+ WriteServ_NoFormat(user->fd,list);
}
}