diff options
Diffstat (limited to 'doc/technical/send.txt')
-rw-r--r-- | doc/technical/send.txt | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/doc/technical/send.txt b/doc/technical/send.txt new file mode 100644 index 0000000..38fd916 --- /dev/null +++ b/doc/technical/send.txt @@ -0,0 +1,262 @@ +PREFIXES +======== + + Server prefixes are the ":%s" strings at the beginning of messages. +They are used by servers to route the message properly and by servers to +local clients to update their idea of who is whom. + +":nick!user@host" is a prefix ":name" where name is either a nick +or name of a server is another valid prefix. + +Typical prefix for a local client to a channel: + +":Dianora!db@irc.db.net" + +for a prefix to a remote server: +":Dianora" + +e.g. as seen locally on a channel: + +":Dianora!db@irc.db.net PRIVMSG #us-opers :ON TOP OF ...\r\n" + +e.g. as seen sent to a remote server: +":Dianora PRIVMSG #us-opers :ON TOP OF ...\r\n" + + It has been argued that full prefixes sent locally are a waste of bandwidth +(Isomer from Undernet has argued this). i.e. instead of sending: +":nick!user@host" for a local prefix, one could just send ":nick".. +Unfortunately, this breaks many clients badly. Personally I feel that +until clients are updated to understand that a full prefix isn't always +going to be sent, that this should be held off on. + + As much as possible, prefix generation is now moved "upstairs" as +much as possible. i.e. if its known its a local client only, then the +onus of the prefix generation, is the users, not hidden in send.c +This allows somewhat faster code to be written, as the prefix doesn't +have to be regenerated over and over again. + + Prefixes aren't sent in all cases, such as a new user using NICK +A prefix is needed when it must be routed. + +i.e. + +NICK newnick + + There is obviously no prefix needed from a locally connected client. + + + +FUNCTIONS +========= + +sendto_one() - Should be used for _local_ clients only + it expects the prefix to be pre-built by user. + + usage - sendto_one(struct Client *to, char *pattern, ...); + + typical use: + + sendto_one(acptr,":%s NOTICE %s :I'm tired", me.name); + Note: This was from a server "me" hence only one + name in prefix. + + This would be an example of a client sptr, noticing + acptr IF acptr is known to be a local client: + + sendto_one(acptr,":%s!%s@%s NOTICE %s :You there?", + sptr->name, + sptr->username, + sptr->host, + acptr->name); + +sendto_channel_butone() + - This function sends a var args message to a channel globally, + except to the client specified as "one", the prefix + is built by this function on the fly as it has to + be sent both to local clients on this server and to + remote servers. +D clients are omitted, as this is used + only for PRIVMSG/NOTICE. + + usage - sendto_channel_butone(struct Client *one, + struct Client *from, + struct Channel *chptr, + const char *pattern, ... ); + + sendto_channel_butone(cptr, sptr, chptr + "PRIVMSG %s :HI!", + chptr->chname); + + e.g. if channel message is coming from "cptr" + it must not be sent back to cptr. + + +sendto_ll_serv_butone(struct Client *one, struct Client *sptr, int add, + const char *pattern, ...) + + - This function is almost identical to sendto_channel_butone + however, it will also not send on a nick as given by sptr, + if target server does not "know" about it. + As the name implies, it is used for "lazylinks" + +sendto_server() + - This function sends specified var args message + to all connected servers except the client "one" + - chptr can be NULL, in which case it goes to server + - caps is a set of CAPS to send =to= + - nocaps is a set of CAPS to not send =to= + + usage - sendto_server(struct Client *one, + struct Channel *chptr, + unsigned long caps, + unsigned long nocaps, + unsigned long llflags, + const char *pattern, ... ); + + +sendto_common_channels_local() + - This function is used only by m_nick and exit_one_client + its used to propagate nick changes to all channels user + is in, and QUIT messages to all channels user is in. + As it only sends to local clients, prefix generation + is left to the user. It also sends the message to the + user if the user isn't on any channels. + + usage - sendto_common_channels_local(struct Client *user, + const char *pattern, + ...); + +sendto_channel_local() + - This function is used only to send locally, never + to remote servers. This is useful when removing + local chanops, or adding a local chanop. MODE/SJOIN + sent to remote server allows that server to propagate + mode changes to its clients locally. If nodeaf is YES, + +D clients are omitted (used for delivering WALLCHOPS). + + usage - sendto_channel_local(type, nodeaf, + struct Channel *chptr, + const char *pattern, ... ); + + + prefix must be pre-built. type is a flag + denoting ONE of + ALL_MEMBERS - all members locally are sent to + NON_CHANOPS - only non-chanops see this + ONLY_CHANOPS_VOICED - both chanops and voiced see this + ONLY_CHANOPS - only chanops see this + + +sendto_match_butone() +match_it() - both only used for the old style oper masking + i.e. /msg #hostmask which in hyb7 is /msg $#hostmask + or /msg $servermask in hyb7 /msg $$servermask + + usage - match_it(struct Client *one, + const char *mask, + int what); + + one is the client to match on either hostmask or servermask + mask is the actual mask + what is either MATCH_HOST or MATCH_SERVER + + usage - sendto_match_butone(struct Client *one, + struct Client *from, + char *mark, + int what, + const char *pattern, ... ); + +sendto_channel_remote() + - Is only used to send a message to a remote server + + +sendto_match_cap_servs() + - Is used only to send MODE lists to remote server + who are capable of it. i.e. MODE #channel +e nick!user@host + +sendto_match_noncap_servs() + - Is used only to send MODE lists to remote servers that + are not capable of it. i.e. MODE #channel +o nick + - This allows you to send a MODE #channel +h nick via + sendto_match_cap_servs and MODE #channel +o nick to + servers which don't support it. + +sendto_anywhere() + - Allows the sending of a message to any client on the net + without knowing whether its local or remote. The penalty + is the calculation of a run-time prefix. + It is less efficient then sendto_one() + + usage - sendto_anywhere(struct Client *to, + struct Client *from, + const char *pattern, ...); + + e.g. + sendto_anywhere(acptr, sptr, + "PRIVMSG Larz :Hi, Where ever you are"); + +sendto_realops_flags() + - combines old sendto_realops and sendto_realops_flags + sends specified message to opers locally only + depending on two flags, UMODE i.e. +y +d or UMODE_SERVNOTICE + or special case, UMODE_ALL (see client.h UMODE flags ) + to send to any oper. The second flag gives the level + of whom to send the messages to, OPERS, ADMINS only or both. + (See send.h for those flags) + + usage - sendto_realops_flags(int umode, int level, + const char *pattern, ... ); + + e.g. + sendto_realops_flags(UMODE_ALL, L_ALL, + "Don't eat the yellow snow"); + +sendto_wallops_flags() + - sends specified message to opers locally, + depending on flags. used for messages that need + to be in wallops form + + usage - sendto_wall_flags(int flags, + struct Client *, const char *patterm ...); + + e.g. + sendto_wallops_flags(UMODE_WALLOP, + sptr, "Message"); + +ts_warn() - Only used to send warning messages to all opers + without flooding them with warnings. + It limits the number of warnings to no more than 5 + every 5 seconds. It probably can go away now. + + usage - ts_warn(const char *pattern, ... ); + +*** LOCAL HELPER FUNCTIONS (static) *** + +send_format() - Used to format a varargs buffer into given buffer + returns length of buffer built, enforces RFC1459 length + limits and appends \r\n as per rfc. + + usage - send_format(char *sendbuf, + const char *pattern, ... ); + +send_message() + - This local function does the actual send of message + + usage: send_message(struct Client *to, char *msg, int len); + + The message has to be pre-formatted and the length + must be pre-calculated. + +send_message_remote() + - This local function does the actual send of message to + remote clients + + usage: send_message_remote(struct Client *to, + struct Client *from, char *msg, int len); + + The message has to be pre-formatted and the length + must be pre-calculated. + + +-- Diane Bruce + +$Id$ |