Skip to content

Instantly share code, notes, and snippets.

@vhata
Forked from imsickofmaps/scaleconf.py
Last active December 16, 2015 12:19

Revisions

  1. vhata revised this gist Apr 22, 2013. 1 changed file with 18 additions and 85 deletions.
    103 changes: 18 additions & 85 deletions scaleconf.py
    Original file line number Diff line number Diff line change
    @@ -1,88 +1,21 @@
    from twisted.internet.defer import inlineCallbacks, returnValue

    from vumi.application import ApplicationWorker
    from vumi.persist.txredis_manager import TxRedisManager
    from vumi.config import ConfigDict


    class SmitterApplicationConfig(ApplicationWorker.CONFIG_CLASS):
    redis_manager = ConfigDict(
    "Redis client configuration.", default={}, static=True)


    class SmitterApplication(ApplicationWorker):

    CONFIG_CLASS = SmitterApplicationConfig

    @inlineCallbacks
    def setup_application(self):
    config = self.get_static_config()
    # This is the key in redis where we will store our set of
    # users across restarts
    self.members_key = 'SmitterMembers'
    # load and expose redis to the application
    self.redis = yield TxRedisManager.from_config(
    config.redis_manager)

    @inlineCallbacks
    def broadcast(self, content, sender):
    """
    Sends a broadcast to everyone except the person sending it.
    Returns the number of messages sent so the person can be notified
    """
    members = yield self.redis.smembers(self.members_key)
    sent = 0
    for member in members:
    if member != sender:
    yield self.send_to(member, content)
    sent += 1
    returnValue(sent)

    @inlineCallbacks
    def consume_user_message(self, message):
    """
    The main switch for consuming smitter messages.
    Any message that is starting with one of the codes below is
    just broadcast. Initial codes for intelligence:
    + : join channel
    - : leave channe1
    ? <number> : invite friend (has to reply + to join)
    @ : asks people where they are
    # : sets topic that the person wants to discuss
    """
    if message['content'] == '+':
    # Join channel
    yield self.redis.sadd(self.members_key, message.user())
    yield self.reply_to(
    message, 'You have joined Smitter! SMS "-" to leave, \
    "? <num>" to invite, "@" to ask locations, \
    "# <topic>" to broadcast subject')
    elif message['content'] == '-':
    # leave channel
    def join_channel(self, message):
    yield self.redis.sadd(self.members_key, message.user())
    yield self.reply_to(
    message, 'You have joined Smitter! SMS "-" to leave, \
    "? <num>" to invite, "@" to ask locations, \
    "# <topic>" to broadcast subject')

    def leave_channel(self, message):
    yield self.redis.srem(self.members_key, message.user())
    yield self.reply_to(
    message, 'You have left Smitter. SMS "+" to join.')
    elif message['content'].startswith('?'):
    # invite <number>
    yield self.reply_to(
    message, 'Invited your buddy')
    yield self.send_to(message['content'].split()[1],
    'Join this group by replying \'+\'')
    elif message['content'].startswith('@'):
    # request location
    yield self.reply_to(
    message, 'You\'ve asked where everyone is.')
    yield self.broadcast('Someone wants to know where everyone is. \
    Reply with your location.', message.user())
    elif message['content'].startswith('#'):
    # set topic
    topic = message['content'][2:]
    yield self.reply_to(
    message, 'You changed the topic to ' + topic)
    yield self.broadcast('Someone changed the topic to: '
    + topic, message.user())
    else:
    # broadcast and get total sent
    sent = yield self.broadcast(message['content'], message.user())
    yield self.reply_to(
    message, 'Broadcast to %s members' % sent)

    def thing(self, message):
    handlers = {
    '+': self.join_channel,
    '-': self.leave_channel,
    ...
    }

    handlers[message['content']](message)

  2. @imsickofmaps imsickofmaps created this gist Apr 20, 2013.
    88 changes: 88 additions & 0 deletions scaleconf.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    from twisted.internet.defer import inlineCallbacks, returnValue

    from vumi.application import ApplicationWorker
    from vumi.persist.txredis_manager import TxRedisManager
    from vumi.config import ConfigDict


    class SmitterApplicationConfig(ApplicationWorker.CONFIG_CLASS):
    redis_manager = ConfigDict(
    "Redis client configuration.", default={}, static=True)


    class SmitterApplication(ApplicationWorker):

    CONFIG_CLASS = SmitterApplicationConfig

    @inlineCallbacks
    def setup_application(self):
    config = self.get_static_config()
    # This is the key in redis where we will store our set of
    # users across restarts
    self.members_key = 'SmitterMembers'
    # load and expose redis to the application
    self.redis = yield TxRedisManager.from_config(
    config.redis_manager)

    @inlineCallbacks
    def broadcast(self, content, sender):
    """
    Sends a broadcast to everyone except the person sending it.
    Returns the number of messages sent so the person can be notified
    """
    members = yield self.redis.smembers(self.members_key)
    sent = 0
    for member in members:
    if member != sender:
    yield self.send_to(member, content)
    sent += 1
    returnValue(sent)

    @inlineCallbacks
    def consume_user_message(self, message):
    """
    The main switch for consuming smitter messages.
    Any message that is starting with one of the codes below is
    just broadcast. Initial codes for intelligence:
    + : join channel
    - : leave channe1
    ? <number> : invite friend (has to reply + to join)
    @ : asks people where they are
    # : sets topic that the person wants to discuss
    """
    if message['content'] == '+':
    # Join channel
    yield self.redis.sadd(self.members_key, message.user())
    yield self.reply_to(
    message, 'You have joined Smitter! SMS "-" to leave, \
    "? <num>" to invite, "@" to ask locations, \
    "# <topic>" to broadcast subject')
    elif message['content'] == '-':
    # leave channel
    yield self.redis.srem(self.members_key, message.user())
    yield self.reply_to(
    message, 'You have left Smitter. SMS "+" to join.')
    elif message['content'].startswith('?'):
    # invite <number>
    yield self.reply_to(
    message, 'Invited your buddy')
    yield self.send_to(message['content'].split()[1],
    'Join this group by replying \'+\'')
    elif message['content'].startswith('@'):
    # request location
    yield self.reply_to(
    message, 'You\'ve asked where everyone is.')
    yield self.broadcast('Someone wants to know where everyone is. \
    Reply with your location.', message.user())
    elif message['content'].startswith('#'):
    # set topic
    topic = message['content'][2:]
    yield self.reply_to(
    message, 'You changed the topic to ' + topic)
    yield self.broadcast('Someone changed the topic to: '
    + topic, message.user())
    else:
    # broadcast and get total sent
    sent = yield self.broadcast(message['content'], message.user())
    yield self.reply_to(
    message, 'Broadcast to %s members' % sent)