Пример #1
0
ChannelIndexData::ChannelIndexData(ChatChannel channel)
  : count(0)
  , options(NoOptions)
  , visibility(0)
  , name(channel->name())
{
  FeedPtr feed = channel->feed(FEED_NAME_INFO, false);
  if (!feed)
    return;

  visibility = feed->data().value(INFO_FEED_VISIBILITY_KEY, 0).toInt();
  if (visibility < 0)
    return;

  if (channel->permanent())
    options |= Permanent;

  id    = channel->id();
  count = channel->channels().size();
  title = feed->data().value(INFO_FEED_TITLE_KEY).toMap().value(INFO_FEED_TEXT_KEY).toString();

  if (feed->data().value(INFO_FEED_PINNED_KEY, false).toBool())
    options |= Pinned;

  FeedPtr acl = channel->feed(FEED_NAME_ACL, false);
  if (acl && AclValue::match(acl.data(), 0) == 0)
    options |= Private;
}
Пример #2
0
/*!
 * Определение доступных прав пользователя, для определения какие действия над сообщением возможны.
 */
int HistoryChatView::permissions(const MessageRecord &record) const
{
  if (!record.id)
    return NoPermissions;

  FeedPtr messages = ChatClient::server()->feed(FEED_NAME_MESSAGES, false);
  if (!messages)
    return NoPermissions;

  const QVariantMap data = messages->data();
  const int flags        = data.value(MESSAGES_FEED_EDITABLE_KEY, DefaultEditFlags).toInt();
  const bool timeout     = (qAbs(ChatClient::date() - record.date) / 1000) > data.value(MESSAGES_FEED_TIMEOUT_KEY, DefaultTimeOut).toInt();

  if (record.senderId == ChatClient::id() && (flags & SelfEdit) && !timeout)
    return Remove | Modify;

  if (ChatId(record.destId).type() != ChatId::ChannelId)
    return NoPermissions;

  const int acl = ClientFeeds::match(ChatClient::channels()->get(record.destId), ChatClient::channel());
  if ((acl & Acl::SpecialWrite) || (acl & Acl::Edit)) {
    int out = 0;
    if (flags & ModeratorRemove) out |= Remove;
    if (flags & ModeratorEdit)   out |= Modify;

    return out;
  }

  return NoPermissions;
}
Пример #3
0
bool ProfileField::apply(const QVariant &value)
{
  FeedPtr feed = ChatClient::channel()->feed(FEED_NAME_PROFILE, false);
  if (!feed)
    return false;

  if (feed->data().value(m_field) == value)
    return false;

  return ClientFeeds::post(ChatClient::id(), FEED_NAME_PROFILE + LC('/') + m_field, value, Feed::Echo | Feed::Share | Feed::Broadcast);
}
Пример #4
0
void ProfileField::reload()
{
  FeedPtr feed = ChatClient::channel()->feed(FEED_NAME_PROFILE, false);
  if (!feed)
    return;

  QVariant data = feed->data().value(m_field);
  if (data.isNull())
    return;

  setData(data);
}
Пример #5
0
/*!
 * Фильтрация сообщения.
 *
 * \return Notice::OK если всё в порядке или другое значение, если сообщение должно быть отклонено.
 */
int NodeMessages::filter()
{
  if (!m_dest)
    return Notice::NotFound;

  if (m_dest->type() == ChatId::ServerId)
    return Notice::BadRequest;

  if (m_dest->type() == ChatId::ChannelId && !m_dest->channels().contains(m_sender->id()))
    return Notice::BadRequest;

  if (!m_dest->canWrite(m_sender))
    return Notice::Forbidden;

  if (m_dest->type() == ChatId::ChannelId) {
    const FeedPtr feed = m_dest->feed(FEED_NAME_INFO, true, false);
    if (m_packet->command() == LS("image") && !feed->data().value(INFO_FEED_IMAGES_KEY, true).toBool())
      return Notice::Forbidden;
  }

  return Notice::OK;
}
Пример #6
0
/*!
 * Фиксация события обновления фида \b user и отправка уведомления об этом.
 */
void Hosts::updateUserFeed(HostInfo host, const QString &method, quint64 socket)
{
  FeedPtr user     = this->user();
  FeedEvent *event = new FeedEvent(m_channel->id(), m_channel->id(), method);

  if (!user->head().f().isEmpty()) {
    event->broadcast = Sockets::all(Ch::channel(m_channel->id()), true);

    if (method == FEED_METHOD_POST)
      event->broadcast.removeAll(socket);
  }

  event->name      = FEED_NAME_USER;
  event->diffTo    = user->head().date();
  event->date      = m_date;
  event->status    = Notice::OK;
  event->path      = SimpleID::encode(host->hostId);
  event->socket    = socket;

  user->data()[LS("last")] = event->path;

  FeedStorage::save(user, m_date);
  FeedEvents::start(event);
}