text: import os
  
  from marshmallow import fields
  from marshmallow.schema import Schema
  
  from platypush.schemas import StrippedString
  
  
  class IRCServerSchema(Schema):
      server = fields.String(
          required=True,
          metadata=dict(
              description='Server address or hostname',
              example='irc.example.org',
          )
      )
  
      port = fields.Int(
          missing=6667,
          metadata=dict(
              description='IRC server port',
              example=6667,
          )
      )
  
      password = fields.String(allow_none=True, default=None, metadata=dict(example='password'))
      nickname = fields.String(required=True, metadata=dict(example='testbot'))
      realname = fields.String(allow_none=True, metadata=dict(example='My Real Name'))
      alias = StrippedString(
          metadata=dict(description='Friendly name for this bot/server connection')
      )
  
      channels = fields.List(
          fields.String(),
          missing=list,
          metadata=dict(
              description='List of channels the bot will connect to',
              example=['#channel1', '#channel2', '#channel3']
          )
      )
  
      ssl = fields.Boolean(missing=False)
      ipv6 = fields.Boolean(missing=False)
      stop_message = StrippedString(missing='Application stopped', metadata=dict(description='Quit/die message'))
  
      dcc_ip_whitelist = fields.List(
          fields.String,
          missing=list,
          metadata=dict(
              description='If specified then only DCC connections from the IP addresses on this list will be accepted',
          )
      )
  
      dcc_ip_blacklist = fields.List(
          fields.String,
          missing=list,
          metadata=dict(
              description='If specified then DCC connections from the IP addresses on this list will be rejected',
          )
      )
  
      dcc_nick_whitelist = fields.List(
          fields.String,
          missing=list,
          metadata=dict(
              description='If specified then only DCC connections from the nicknames on this list will be accepted',
          )
      )
  
      dcc_nick_blacklist = fields.List(
          fields.String,
          missing=list,
          metadata=dict(
              description='If specified then DCC connections from the nicknames on this list will be rejected',
          )
      )
  
      dcc_downloads_dir = fields.String(
          missing=os.path.join(os.path.expanduser('~'), 'Downloads'),
          metadata=dict(description='DCC file transfers will be downloaded to this folder (default: ~/Downloads)'),
      )
  
      response_timeout = fields.Number(
          missing=30.,
          metadata=dict(
              description='How long we should wait for a response to an IRC request '
                          '(default: 30 seconds)',
          )
      )
  
      dcc_file_transfer_timeout = fields.Number(
          missing=30.,
          metadata=dict(
              description='How long we should wait on a pending DCC file transfer with '
                          'no data being transmitted (default: 30 seconds)',
          )
      )
  
      dcc_accept_timeout = fields.Number(
          missing=300.,
          metadata=dict(
              description='How long we should wait on a pending DCC request '
                          'until the user accepts (default: 300 seconds)',
          )
      )
  
      dcc_max_connections = fields.Int(
          missing=10,
          metadata=dict(
              description='Maximum number of concurrent DCC connections allowed on this bot (default: 10)'
          )
      )
  
  
  class IRCServerStatusSchema(Schema):
      server = StrippedString(required=True)
      port = fields.Int(required=True)
      alias = StrippedString()
      real_name = fields.String()
      nickname = fields.String()
      is_connected = fields.Boolean()
      connected_channels = fields.List(fields.String)
  
  
  class IRCChannelSchema(Schema):
      name = fields.String(required=True)
      modes = fields.List(fields.String)
      opers = fields.List(fields.String)
      owners = fields.List(fields.String)
      users = fields.List(fields.String)
      voiced = fields.List(fields.String)
      is_invite_only = fields.Boolean()
      is_moderated = fields.Boolean()
      is_protected = fields.Boolean()
      is_secret = fields.Boolean()
  