+static MODCMD_FUNC(cmd_svsjoin)
+{
+ struct userNode *target;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ if(!IsChannelName(argv[2]))
+ {
+ reply("MSG_NOT_CHANNEL_NAME");
+ return 0;
+ }
+ irc_svsjoinchan(opserv,target,argv[2]);
+ reply("OSMSG_SVSJOIN",target->nick,argv[2]);
+ return 1;
+}
+
+static MODCMD_FUNC(cmd_svsnick)
+{
+ struct userNode *target;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ if(GetUserH(argv[2]))
+ {
+ reply("OSMSG_SVSNICKUSED",argv[2]);
+ return 0;
+ }
+ irc_svsnick(opserv,target,argv[2]);
+ reply("OSMSG_SVSNICK",target->nick,argv[2]);
+ return 1;
+}
+
+static MODCMD_FUNC(cmd_svsmode)
+{
+ struct userNode *target;
+ char *modestr;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ modestr = unsplit_string(argv + 2, argc - 2, NULL);
+ irc_svsmode(opserv,target,modestr);
+ reply("OSMSG_SVSMODE",modestr,target->nick);
+ return 1;
+}
+
+static MODCMD_FUNC(cmd_simul)
+{
+ struct userNode *target;
+ char *line;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ line = unsplit_string(argv + 2, argc - 2, NULL);
+ irc_simul(target,line);
+ reply("OSMSG_SIMUL",target->nick,line);
+ return 1;
+}
+
+static MODCMD_FUNC(cmd_relay)
+{
+ struct userNode *target;
+ char *line;
+ if(!(target=GetUserH(argv[1]))) {
+ reply("OSMSG_SVSNONICK", argv[1]);
+ return 0;
+ }
+ line = unsplit_string(argv + 2, argc - 2, NULL);
+ char sendline[512];
+ if(channel)
+ sprintf(sendline, "relay %s %s :%s",user->nick,channel->name,line);
+ else
+ sprintf(sendline, "relay %s query :%s",user->nick,line);
+ irc_privmsg(opserv,target->numeric,sendline);
+ return 1;
+}
+