Ejemplo n.º 1
0
    def test_conversation_sorting(self):
        lastest = Conversation(self.user1, 'lastest', start_time=datetime(2013,1,1))
        Conversation(self.user1, 'last', start_time=datetime(2013,1,3))
        Conversation(self.user1, 'first', start_time=datetime(2013,1,1))
        Conversation(self.user1, 'middle', start_time=datetime(2013,1,2))
        lastest.update_time = datetime(2013,1,4)
        db.session.commit()

        r = self.app.get(self.path)
        d = PyQuery(r.data)
        assert len(d('.conversation')) == 4
        assert [e.text() for e in d('.conversation > .title > a').items()] == ['lastest', 'last', 'middle', 'first']
Ejemplo n.º 2
0
    def test_unread_conversations(self):
        user = User('user', '123456')
        conv1 = Conversation(user, 'first conversation')
        conv1.messages.append(Message(user, 'first conversation message'))
        conv2 = Conversation(user, 'second conversation')
        conv2.messages.append(Message(user, 'second conversation message'))
        db.session.add(user)
        db.session.commit()

        user.set_last_read_message(conv2, conv2.messages[-1].id)
        db.session.commit()

        assert len(conv1.get_unread_messages(user)) == 1
        assert len(conv2.get_unread_messages(user)) == 0

        conversations = user.get_unread_conversations()
        assert len(conversations) == 1
        assert conversations[0].title == 'first conversation'
Ejemplo n.º 3
0
 def setUp(self):
     super(UnreadTests, self).setUp()
     self.user1 = User('self.user1', '123456')
     self.user2 = User('self.user2', '123456')
     self.conv = Conversation(self.user1, 'some title')
     self.conv.messages.append(Message(self.user2, 'first message'))
     self.conv.messages.append(Message(self.user2, 'second message'))
     self.conv.messages.append(Message(self.user1, 'third message'))
     self.conv.messages.append(Message(self.user2, 'fourth message'))
     db.session.add_all([self.user1, self.user2])
     db.session.commit()
Ejemplo n.º 4
0
def _make_estimator():
    params = tf.contrib.training.HParams(**Config.model.to_dict())
    # Using CPU
    run_config = tf.contrib.learn.RunConfig(
        model_dir=Config.train.model_dir,
        session_config=tf.ConfigProto(device_count={'GPU': 0}))

    conversation = Conversation()
    return tf.estimator.Estimator(model_fn=conversation.model_fn,
                                  model_dir=Config.train.model_dir,
                                  params=params,
                                  config=run_config)
Ejemplo n.º 5
0
    async def _instantiate_dialog(self, user: User, peer: Union[User, Bot]):
        log.info(f'instantiating the dialog')
        conversation = Conversation(participant1=ConversationPeer(peer=user),
                                    participant2=ConversationPeer(peer=peer))
        profiles = await run_sync_in_executor(PersonProfile.objects)
        profiles_count = await run_sync_in_executor(profiles.count)
        for p in conversation.participants:
            p.assigned_profile = profiles[random.randrange(profiles_count)]

        while True:
            conv_id = random.getrandbits(31)
            if conv_id not in self._active_dialogs and \
                    await run_sync_in_executor(lambda: Conversation.objects(conversation_id=conv_id).count()) == 0:
                break
        conversation.conversation_id = conv_id
        self._active_dialogs[conv_id] = conversation

        for p in conversation.participants:
            target_gateway = self._gateway_for_peer(p)
            await target_gateway.start_conversation(conv_id, p.peer, p.assigned_profile)

        self._reset_inactivity_timer(conv_id)
Ejemplo n.º 6
0
def experiment_fn(run_config, params):
    # 先定义estimator
    conversation = Conversation()
    estimator = tf.estimator.Estimator(model_fn=conversation.model_fn,
                                       model_dir=Config.train.model_dir,
                                       params=params,
                                       config=run_config)

    # 返回字典
    vocab = data_loader.load_vocab("vocab")
    Config.data.vocab_size = len(vocab)

    # 定义训练数据
    train_X, test_X, train_y, test_y = data_loader.make_train_and_test_set()

    train_input_fn, train_input_hook = data_loader.make_batch(
        (train_X, train_y), batch_size=Config.model.batch_size)
    test_input_fn, test_input_hook = data_loader.make_batch(
        (test_X, test_y), batch_size=Config.model.batch_size, scope="test")

    train_hooks = [train_input_hook]
    if Config.train.print_verbose:
        train_hooks.append(
            hook.print_variables(
                variables=['train/enc_0', 'train/dec_0', 'train/pred_0'],
                rev_vocab=utils.get_rev_vocab(vocab),
                every_n_iter=Config.train.check_hook_n_iter))
    if Config.train.debug:
        train_hooks.append(tf_debug.LocalCLIDebugHook())

    eval_hooks = [test_input_hook]
    if Config.train.debug:
        eval_hooks.append(tf_debug.LocalCLIDebugHook())

    # 定义实验
    experiment = tf.contrib.learn.Experiment(
        estimator=estimator,
        train_input_fn=train_input_fn,
        eval_input_fn=test_input_fn,
        train_steps=Config.train.train_steps,
        min_eval_frequency=Config.train.min_eval_frequency,
        train_monitors=train_hooks,
        eval_hooks=eval_hooks,
        eval_delay_secs=0)
    return experiment
Ejemplo n.º 7
0
def main_route():
    if request.method == 'POST':
        try:
            payload = request.get_json()
            for message, sender in messaging_events(payload):
                # if a convo with this sender exists, run the appropriate protocol

                #found = convos.find_one({"id": sender}).count()

                #if  found != 0:
                #	temp = Conversation(sender);
                #	temp.prefs = found["prefs"]
                #	temp.curState = found["curState"]
                #	temp.id = found["id"]
                #	temp.numBeds = found["numBeds"]
                #	parse_and_respond(temp, message)
                #	convos.update_one({"id": sender}, temp)
                #else:
                #	temp = Conversation(sender);
                #	convos.insert_one(temp)
                #	message = "Initial question  as result of function here"

                if sender in convos:
                    parse_and_respond(sender, message)
                else:
                    convos[sender] = Conversation(sender)
                    parse_and_respond(sender, message)

            return "okay"

        except Exception as e:
            print(type(e))
            print(e.args)

    elif request.method == 'GET':
        if request.args.get('hub.verify_token') == config.env['verify_token']:
            return request.args.get('hub.challenge')
        return "Wrong Verify Token"

    return "Hello World"
Ejemplo n.º 8
0
def check_or_create_conversation(user_id):
    """Checks if there is a chat history between the current user and the other user_id. If there is, it loads the history,
    if there isn't it creates a row in the table. Users are assigned to messager1 or 2 depending on whose user is is larger.

    """

    bigger = max(current_user.id, int(user_id))
    lower = min(current_user.id, int(user_id))
    conversation = Conversation.query.filter(
        (Conversation.messager_1 == bigger)
        & (Conversation.messager_2 == lower)).first()

    if not conversation:
        new_convo = Conversation(messager_1=bigger, messager_2=lower)

        db.session.add(new_convo)
        db.session.commit()

        # As soon as the conversation has been added to the database, query the database for the conversation.
        conversation = Conversation.query.filter(
            (Conversation.messager_1 == bigger)
            & (Conversation.messager_2 == lower)).first()

    return redirect(f'/chat/messages/{conversation.id}')
Ejemplo n.º 9
0
class UnreadTests(Base):
    def setUp(self):
        super(UnreadTests, self).setUp()
        self.user1 = User('self.user1', '123456')
        self.user2 = User('self.user2', '123456')
        self.conv = Conversation(self.user1, 'some title')
        self.conv.messages.append(Message(self.user2, 'first message'))
        self.conv.messages.append(Message(self.user2, 'second message'))
        self.conv.messages.append(Message(self.user1, 'third message'))
        self.conv.messages.append(Message(self.user2, 'fourth message'))
        db.session.add_all([self.user1, self.user2])
        db.session.commit()

    def test_all_unread(self):
        messages = self.conv.get_unread_messages(for_user=self.user1)
        assert len(messages) == 4
        messages = self.conv.get_unread_messages(for_user=self.user2)
        assert len(messages) == 4

    def test_no_unread(self):
        self.user1.set_last_read_message(self.conv, message_id=4)
        db.session.commit()
        messages = self.conv.get_unread_messages(for_user=self.user1)
        assert len(messages) == 0

    def test_some_unread(self):
        self.user1.set_last_read_message(self.conv, message_id=2)
        self.user1.set_last_read_message(self.conv, message_id=3)
        user1messages = self.conv.get_unread_messages(for_user=self.user1)
        user2messages = self.conv.get_unread_messages(for_user=self.user2)
        [m.text for m in user1messages] == ['third message', 'fourth message']
        [m.text for m in user2messages] == ['fourth message']

    def test_mark_read(self):
        self.conv.mark_read(self.user1)
        db.session.commit()
        user1messages = self.conv.get_unread_messages(for_user=self.user1)
        assert len(user1messages) == 0
Ejemplo n.º 10
0
def response():
    action = cgi_get("action", choices=["join", "activate", "login", "contact", "edit", "email"])
    if action == "join":
        email = cgi_get("email")
        if CTUser.query(CTUser.email == email).get():
            fail("this email is already in use")
        user_type = cgi_get("utype")
        u = db.get_model(user_type)(email=email,
            firstName=cgi_get("firstName"), lastName=cgi_get("lastName"),
            **cgi_get("extras"))
        u.put() # to generate created timestamp
        u.password = db.hashpass(cgi_get("password"), u.created)
        rule = config.ctuser.activation.get(user_type, config.ctuser.activation.ctuser)
        if rule == "auto":
            u.active = True
        else: # assumes config.mailer (otherwise, don't change activation "auto" default)
            usk = u.key.urlsafe()
            if rule == "confirm":
                send_mail(to=u.email, subject="activation required",
                    body=JOIN%(usk,))
            else: # email admin to handle it
                send_mail(to=rule, subject="activation required", body=JOINED%(email, usk))
        u.put()
        succeed(u.data())
    elif action == "activate":
        u = db.get(cgi_get("key"))
        if u and not u.active: # else, don't even trip
            u.active = True
            u.put()
        send_mail(to=u.email, subject="account activated",
            body=ACTIVATE)
        redirect("/", "you did it!")
    elif action == "login":
        u = CTUser.query(CTUser.email == cgi_get("email"),
            CTUser.active == True).get()
        if not u or u.password != db.hashpass(cgi_get("password"), u.created):
            fail()
        succeed(u.data())
    elif action == "contact":
        sender = db.get(cgi_get("user"))
        message = cgi_get("message")
        convokey = cgi_get("conversation", required=False)
        if convokey:
            conversation = db.get(convokey)
        else:
            conversation = Conversation()
            conversation.topic = cgi_get("topic")
            conversation.participants = [sender.key, db.KeyWrapper(cgi_get("recipient"))]
            conversation.put()
        m = Message(sender=sender.key, conversation=conversation.key, body=message)
        m.put()
        for recipient in conversation.participants:
            if recipient != sender.key:
                send_mail(to=recipient.get().email,
                    subject="message from %s"%(sender.firstName,),
                    body=CONTACT%(sender.fullName(), message,
                        sender.firstName, sender.key.urlsafe(), conversation.key.urlsafe()))
        succeed(convokey and m.key.urlsafe() or conversation.key.urlsafe())
    elif action == "edit":
        changes = cgi_get("changes")
        changes["key"] = cgi_get("user")
        edit(changes)
    elif action == "email":
        sender = db.get(cgi_get("user"))
        if not sender.admin:
            fail()
        recips = cgi_get("recipients", default=[])
        if not recips:
            if config.wpmail:
                log("no recipients specified -- WP mode enabled -- building recipient list...")
                recips = getWPmails()
            else:
                fail("no recipients specified -- can't email nobody")
        batch(recips, lambda chunk : send_mail(bcc=chunk,
            subject=cgi_get("subject"), body=cgi_get("body")), chunk=100)
Ejemplo n.º 11
0
    async def _instantiate_dialog(self, user: User, peer: Union[User, Bot]):
        log.info(f'instantiating the dialog')

        conversation = Conversation(
            participant1=ConversationPeer(
                peer=user, peer_conversation_guid=uuid4().__str__()),
            participant2=ConversationPeer(
                peer=peer, peer_conversation_guid=uuid4().__str__()))

        tags_set: QuerySet = Settings.objects(name='tags')
        active_tags = tags_set.first().value if tags_set.count() else []

        if active_tags:
            profiles: QuerySet = await run_sync_in_executor(
                PersonProfile.objects(tags__in=active_tags))
            if profiles.count() == 0:
                log.warning(f'Not found any profiles with tags: {active_tags}')
                profiles: QuerySet = await run_sync_in_executor(
                    PersonProfile.objects)
        else:
            profiles: QuerySet = await run_sync_in_executor(
                PersonProfile.objects)

        first_profile = None
        linked_profile_uuid = None

        for p in conversation.participants:
            if first_profile is None:
                p.assigned_profile = first_profile = random.choice(profiles)
                linked_profile_uuid = first_profile.link_uuid

            else:
                # profiles assignment order:
                # other profile from the same linked group || profile with unmatching sentences || same profile
                second_profile = random.choice(
                    profiles(id__ne=first_profile.id,
                             link_uuid=linked_profile_uuid)
                    or (profiles(persona__ne=first_profile.persona)
                        or [first_profile]))

                p.assigned_profile = second_profile

        while True:
            conv_id = random.getrandbits(31)
            if conv_id not in self._active_dialogs and \
                    await run_sync_in_executor(lambda: Conversation.objects(conversation_id=conv_id).count()) == 0:
                break
        conversation.conversation_id = conv_id

        conversation.messages_to_switch_topic = self.dialog_options[
            'n_messages_to_switch_topic']
        conversation.reset_topic_switch_counter()

        self._active_dialogs[conv_id] = conversation

        topics = [
            'Социальные сети', 'Фитнес', 'Уборка и чистота', 'Одиночество',
            'Мода', 'Женская внешность', 'Мужская внешность',
            'Деньги, богатство', 'Машины', 'Счастье'
        ]
        curr_topic = random.sample(topics, k=1)
        str_topic = curr_topic[0]
        msg = conversation.add_message(text='Switched to topic ' + str_topic,
                                       sender=peer,
                                       system=True)
        for p in conversation.participants:
            target_gateway = self._gateway_for_peer(p)
            p.assigned_profile.topics[0] = str_topic
            await target_gateway.start_conversation(conv_id, p.peer,
                                                    p.assigned_profile,
                                                    p.peer_conversation_guid)

        self._reset_inactivity_timer(conv_id)
Ejemplo n.º 12
0
def createConversation(userStarted, partner):
    global conversations
    c = Conversation(createNewUid(), userStarted, partner)
    conversations += [c]
    userStarted.conversations += [c]
    return c
Ejemplo n.º 13
0
 def conversation(self):
     return Conversation(conversation_id=3, participant1=self.conversation_peers[0],
                         participant2=self.conversation_peers[1], messages=self.messages,
                         start_time=self.messages[0].time, end_time=self.messages[-1].time)