Clementine-audio-player-Mac.../3rdparty/vreen/vreen/src/api/wallsession.cpp

164 lines
5.1 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
**
** Vreen - vk.com API Qt bindings
**
** Copyright © 2012 Aleksey Sidorov <gorthauer87@ya.ru>
**
*****************************************************************************
**
** $VREEN_BEGIN_LICENSE$
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Lesser General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Lesser General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see http://www.gnu.org/licenses/.
** $VREEN_END_LICENSE$
**
****************************************************************************/
#include "wallsession.h"
#include "contact.h"
#include "wallpost.h"
#include "utils.h"
#include "client_p.h"
#include <QNetworkReply>
namespace Vreen {
static const char *filters[] = {
"owner",
"others",
"all"
};
class WallSession;
class WallSessionPrivate
{
Q_DECLARE_PUBLIC(WallSession)
public:
WallSessionPrivate(WallSession *q, Contact *contact) : q_ptr(q), contact(contact) {}
WallSession *q_ptr;
Contact *contact;
void _q_posts_received(const QVariant &response)
{
auto list = response.toMap().value("wall").toList();
if (!list.isEmpty()) {
list.takeFirst();
foreach (auto item, list) {
auto post = WallPost::fromData(item);
emit q_func()->postAdded(post);
}
}
}
void _q_like_added(const QVariant &response)
{
//FIXME error handler
auto reply = sender_cast<Reply*>(q_func()->sender());
auto url = reply->networkReply()->url();
int id = url.queryItemValue("post_id").toInt();
int retweet = url.queryItemValue("repost").toInt();
auto map = response.toMap();
emit q_func()->postLikeAdded(id,
map.value("likes").toInt(),
map.value("reposts").toInt(),
retweet);
}
void _q_like_deleted(const QVariant &response)
{
auto reply = sender_cast<Reply*>(q_func()->sender());
auto url = reply->networkReply()->url();
int id = url.queryItemValue("post_id").toInt();
int likesCount = response.toMap().value("likes").toInt();
emit q_func()->postLikeDeleted(id, likesCount);
}
};
WallSession::WallSession(Contact *contact) :
QObject(contact),
d_ptr(new WallSessionPrivate(this, contact))
{
}
WallSession::~WallSession()
{
}
/*!
* \brief WallSession::getPosts. A wrapper on API method wall.get, \link http://vk.com/developers.php?oid=-1&p=wall.get
* \param filter determine what types of messages on the wall to get. The following parameter values:
* Owner - messages on the wall by its owner
* Others - posts on the wall, not on its owner
* All - all the messages on the wall
* \param count
* \param offset
* \param extended flag: true - three arrays will be returned to wall, profiles, and groups. By default, additional fields will not be returned.
* \return
*/
Reply *WallSession::getPosts(WallSession::Filter filter, quint8 count, int offset, bool extended)
{
Q_D(WallSession);
QVariantMap args;
args.insert("owner_id", QString::number(d->contact->id()));
args.insert("offset", offset);
args.insert("count", count);
args.insert("filter", filters[filter-1]);
args.insert("extended", extended);
auto reply = d->contact->client()->request("wall.get", args);
connect(reply, SIGNAL(resultReady(QVariant)), SLOT(_q_posts_received(QVariant)));
return reply;
}
Contact *WallSession::contact() const
{
return d_func()->contact;
}
/*!
* \brief Vreen::WallSession::like A wrapper on API method wall.addLike \link http://vk.com/developers.php?oid=-1&p=wall.addLike
* \param postId
* \param retweet
* \return
*/
Vreen::Reply *Vreen::WallSession::addLike(int postId, bool retweet, const QString &message)
{
Q_D(WallSession);
auto reply = d->contact->client()->addLike(d->contact->id(),
postId,
retweet,
message);
connect(reply, SIGNAL(resultReady(QVariant)), SLOT(_q_like_added(QVariant)));
return reply;
}
/*!
* \brief WallSession::deleteLike a wrapper on API method wall.deleteLike \link http://vk.com/developers.php?oid=-1&p=wall.deleteLike
* \param postId
* \return
*/
Reply *WallSession::deleteLike(int postId)
{
Q_D(WallSession);
auto reply = d->contact->client()->deleteLike(d->contact->id(), postId);
connect(reply, SIGNAL(resultReady(QVariant)), SLOT(_q_like_deleted(QVariant)));
return reply;
}
} // namespace Vreen
#include "moc_wallsession.cpp"