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; }
/*! * Определение доступных прав пользователя, для определения какие действия над сообщением возможны. */ 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; }
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); }
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); }
/*! * Фильтрация сообщения. * * \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; }
/*! * Фиксация события обновления фида \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); }