@@ -0,0 +1,806 @@
+from txircd.modbase import Mode%0A%0Aclass VoiceMode(Mode):%0A%09def checkSet(self, user, target, param):%0A%09%09if param not in self.ircd.users:%0A%09%09%09return False%0A%09%09voicingUser = self.ircd.users%5Bparam%5D%0A%09%09if target.name not in voicingUser.channels:%0A%09%09%09return False%0A%09%09if %22v%22 in voicingUser.status(target.name):%0A%09%09%09return False%0A%09%09return True%0A%09%0A%09def checkUnset(self, user, target, param):%0A%09%09if param not in self.ircd.users:%0A%09%09%09return False%0A%09%09devoicingUser = self.ircd.users%5Bparam%5D%0A%09%09if target.name not in devoicingUser.channels:%0A%09%09%09return False%0A%09%09if %22v%22 not in devoicingUser.status(target.name):%0A%09%09%09return False%0A%09%09return True%0A%0Aclass Spawner(object):%0A%09def __init__(self, ircd):%0A%09%09self.ircd = ircd%0A%09%0A%09def spawn(self):%0A%09%09return %7B%0A%09%09%09%22modes%22: %7B%0A%09%09%09%09%22csv%22: VoiceMode()%0A%09%09%09%7D%0A%09%09%7D%0A%09%0A%09def cleanup(self):%0A%09%09self.ircd.removeMode(%22csv%22)

Implement channel mode +v