+static void
+opserv_version(struct userNode *target)
+{
+ irc_version_user(opserv, target);
+}
+
+static void
+opserv_mark(struct userNode *target, UNUSED_ARG(char *src_handle), UNUSED_ARG(char *reason), char *mark)
+{
+ if(!mark)
+ return;
+ irc_mark(target, mark);
+}
+
+static void
+opserv_svsjoin(struct userNode *target, UNUSED_ARG(char *src_handle), UNUSED_ARG(char *reason), char *channame, unsigned int checkrestrictions)
+{
+ struct chanNode *channel;
+
+ if(!channame || !IsChannelName(channame)) {
+ /* Not a valid channel name. We shouldnt ever get this if we check properly in addalert */
+ return;
+ }
+
+ if (!(channel = GetChannel(channame))) {
+ channel = AddChannel(channame, now, NULL, NULL, NULL);
+ }
+ if (GetUserMode(channel, target)) {
+ /* already in it */
+ return;
+ }
+
+ if (checkrestrictions) {
+ if (trace_check_bans(target, channel) == 1) {
+ return; /* found on lamer list */
+ }
+
+ if (channel->modes & MODE_INVITEONLY) {
+ return; /* channel is invite only */
+ }
+
+ if (!IsOper(target) && (channel->modes & MODE_OPERSONLY)) {
+ return; /* user is not oper and channel is opers only */
+ }
+
+ if (!IsAdmin(target) && (channel->modes & MODE_ADMINSONLY)) {
+ return; /* user is not admin and channel is admin only */
+ }
+
+ if (target->handle_info && (channel->modes & MODE_REGONLY)) {
+ return; /* user is not authed and channel is authed only users */
+ }
+
+ if (!IsSSL(target) && (channel->modes & MODE_SSLONLY)) {
+ return; /* user is not SSL and channel is SSL only */
+ }
+
+ if (channel->limit > 0) {
+ if (channel->members.used >= channel->limit) {
+ return; /* channel is invite on */
+ }
+ }
+
+ if (*channel->key) {
+ return; /* channel is password protected */
+ }
+ }
+
+ irc_svsjoin(opserv, target, channel);
+ /* Should we tell the user they got joined? -Rubin*/
+}
+
+static void
+opserv_svspart(struct userNode *target, UNUSED_ARG(char *src_handle), UNUSED_ARG(char *reason), char *channame)
+{
+ struct chanNode *channel;
+
+ if(!channame || !IsChannelName(channame)) {
+ /* Not a valid channel name. We shouldnt ever get this if we check properly in addalert */
+ return;
+ }
+
+ if (!(channel = GetChannel(channame))) {
+ /* channel doesnt exist */
+ return;
+ }
+
+ if (!GetUserMode(channel, target)) {
+ /* not in it */
+ return;
+ }
+
+ irc_svspart(opserv, target, channel);
+}
+