                          User mode 'g' documentation

Since version 7, ircd-hybrid includes a new and powerful feature that all users
can take advantage of to prevent flooding and unwanted messages. This new
feature is invoked by setting user mode 'g'. When set, user will be in
'Caller ID' mode. Any user that messages a +g client will receive a numeric
saying that they are in +g mode (server side ignore). The target client will
also receive a numeric saying that so and so messaged them and that they are in
user mode 'g'.

The target of the message will only receive one notification per minute, from
any client, in order to prevent flooding. The sender will NOT have that rate
limit and will receive a numeric saying the target is in user mode 'g' every
time they send a message. Note that this behavior is similar to the way AWAY
messages are done.

There is also a softer variation of 'g', named 'G', which allows people you
share channels with to talk to you. In other words, messages from users/
spambots sitting on no common channels with you are automatically blocked.

One question that arises is how to message specific users, while blocking out
everyone else. The command 'ACCEPT' is your answer. It takes comma-separated
parameters of users to be added or removed, in the form of 'nick!user@host'
mask. If only nick is specified, the IRCD will convert it to 'nick!*@*'.

You will not receive a reply from the 'ACCEPT' command if it is successful, only
if an error has occured. There are three possible errors, shown by numerics:

  ERR_ACCEPTFULL (456): :irc.example.net 456 user :Accept list is full
  - This is sent when the accept list is full.
  ERR_ACCEPTEXIST (457): :irc.example.net 457 user n!u@h :is already on your accept list
  - This is sent when a client tries to add a mask to their accept list that
  already exists there.
  ERR_ACCEPTNOT (458): :irc.example.net 458 user n!u@h :is not on your accept list
  - This is sent when a client tries to remove a mask from their accept list
  that is not there.

Once user is accepted, your client will keep receiving messages from it until
one of the following happens: user is manually removed from your accept list,
you quit or they change their nick (if mask is based only on nick).

Viewing the accept list is very easy. Issue 'ACCEPT *' or 'ACCEPT' without
parameters.
Removing a mask from your accept list is also simple. Issue 'ACCEPT -<mask>'.

You can add and remove masks at once, but you can't request list.
  'ACCEPT x,y,-z,f,-a' would be acceptable.
  'ACCEPT x,y,-z,*' would add '*!*@*' mask to your accept list.

Like DalNet and UnderNet's 'SILENCE' system, the accept list only exists while
you are connected to IRC. In order for you to have the same accept list every
time you come onto IRC, you must put the 'ACCEPT' command into your client's
auto-perform, or manually issue the command each time.

This system may seem similar to the 'SILENCE'system, but it is actually a
reverse 'SILENCE'. 'SILENCE' ignores certain users and allows the rest. User mode
'g' ignores all users except certain ones (on your accept list). Both systems
have their place, but the user mode 'g' is what the developers thought would be
most useful for clients.

The goals of this user mode are to provide protection from flooding and
spamming, and to provide users with a mean to keep their privacy.

We hope that these goals are obtained.

                                 Sample session

The easiest way to see how this works is by experiencing it. Seeing a sample
session can help you understand what goes on.

Client Hwy-LL is set +g initially.
Client Hwy101 wants to message Hwy-LL.

Client Hwy101: /msg Hwy-LL hi
Hwy101 will see: :irc.example.net 716 Hwy101 Hwy-LL :is in +g mode (server side ignore)
                 :irc.example.net 717 Hwy101 Hwy-LL :has been informed you messaged them.
Hwy-LL will see: :irc.example.net 718 Hwy-LL Hwy101 :is messaging you, and you are umode +g.

If Hwy101 sends another message to Hwy-LL (before the minute expires), he will
see: :irc.example.net 716 Hwy101 Hwy-LL :is in +g mode (server side ignore)
and will not receive the second numeric. Hwy-LL will NOT see any numeric.

Hwy-LL now wishes to see messages from Hwy101 and SpamBot.

Client Hwy-LL: /accept Hwy101,SpamBot

Neither side will be told of the change in the accept list, Hwy-LL should
presume that the accept was successful if no error occurs.

Now Hwy-LL can see messages from Hwy101 and SpamBot without any blockage. If
Hwy101 is also set +g, then he would have to issue /accept Hwy-LL
before he would be able to see messages from Hwy-LL.

Hwy-LL now wants to see who is on his accept list.

Client Hwy-LL: /accept *

Hwy-LL will see: :irc.example.net 281 Hwy-LL :Hwy101!*@* SpamBot!*@*
                 :irc.example.net 282 Hwy-LL :End of /ACCEPT list.

The replies are in numeric form to help parsing by scripts.

Hwy-LL realizes he added a spambot to his list and wants to remove it, and
allow messages from services.

Client Hwy-LL: /accept -SpamBot,*!*@services.example.net

Hwy-LL will now only accept messages from Hwy101 and services.

W. Campbell
