149 lines
4.2 KiB
C++
149 lines
4.2 KiB
C++
/****************************************************************************
|
||
**
|
||
** 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 "newsfeed.h"
|
||
#include "utils.h"
|
||
#include "client.h"
|
||
#include "roster.h"
|
||
#include "groupmanager.h"
|
||
#include <QVariantList>
|
||
|
||
namespace Vreen {
|
||
|
||
static const char *filters_str[] = {
|
||
"post",
|
||
"photo",
|
||
"photo_tag",
|
||
"friend",
|
||
"note"
|
||
};
|
||
|
||
class NewsFeed;
|
||
class NewsFeedPrivate
|
||
{
|
||
Q_DECLARE_PUBLIC(NewsFeed)
|
||
public:
|
||
NewsFeedPrivate(NewsFeed *q, Client *client) : q_ptr(q), client(client) {}
|
||
NewsFeed *q_ptr;
|
||
Client *client;
|
||
|
||
void updateProfiles(const QVariantList &profiles)
|
||
{
|
||
foreach (auto item, profiles) {
|
||
auto map = item.toMap();
|
||
int uid = map.value("uid").toInt();
|
||
|
||
if (uid > 0) {
|
||
auto roster = client->roster();
|
||
auto buddy = roster->buddy(uid);
|
||
Contact::fill(buddy, map);
|
||
} else {
|
||
auto manager = client->groupManager();
|
||
auto group = manager->group(-uid);
|
||
Contact::fill(group, map);
|
||
}
|
||
}
|
||
}
|
||
|
||
void updateGroups(const QVariantList &groups)
|
||
{
|
||
foreach (auto item, groups) {
|
||
auto map = item.toMap();
|
||
auto manager = client->groupManager();
|
||
int gid = -map.value("gid").toInt();
|
||
auto contact = manager->group(gid);
|
||
Contact::fill(contact, map);
|
||
}
|
||
}
|
||
|
||
void _q_news_received(const QVariant &response)
|
||
{
|
||
Q_Q(NewsFeed);
|
||
auto map = response.toMap();
|
||
updateProfiles(map.value("profiles").toList());
|
||
updateGroups(map.value("groups").toList());
|
||
|
||
auto items = map.value("items").toList();
|
||
NewsItemList news;
|
||
foreach (auto item, items) {
|
||
auto newsItem = NewsItem::fromData(item);
|
||
auto map = item.toMap();
|
||
auto itemCount = strCount(filters_str);
|
||
for (size_t i = 0; i != itemCount; i++) {
|
||
auto list = map.value(filters_str[i]).toList();
|
||
if (list.count()) {
|
||
auto count = list.takeFirst().toInt();
|
||
Q_UNUSED(count);
|
||
newsItem.setAttachments(Attachment::fromVariantList(list));
|
||
break;
|
||
}
|
||
}
|
||
news.append(newsItem);
|
||
}
|
||
emit q->newsReceived(news);
|
||
}
|
||
};
|
||
|
||
/*!
|
||
* \brief The NewsFeed class
|
||
* Api reference: \link http://vk.com/developers.php?oid=-1&p=Расширенные_методы_API
|
||
*/
|
||
|
||
/*!
|
||
* \brief NewsFeed::NewsFeed
|
||
* \param client
|
||
*/
|
||
NewsFeed::NewsFeed(Client *client) :
|
||
QObject(client),
|
||
d_ptr(new NewsFeedPrivate(this, client))
|
||
{
|
||
|
||
}
|
||
|
||
NewsFeed::~NewsFeed()
|
||
{
|
||
|
||
}
|
||
|
||
/*!
|
||
* \brief NewsFeed::getNews API reference is \link http://vk.com/developers.php?oid=-1&p=newsfeed.get
|
||
* \return
|
||
*/
|
||
Reply *NewsFeed::getNews(Filters filters, quint8 count, int offset)
|
||
{
|
||
QVariantMap args;
|
||
args.insert("count", count);
|
||
args.insert("filters", flagsToStrList(filters, filters_str).join(","));
|
||
args.insert("offset", offset);
|
||
|
||
auto reply = d_func()->client->request("newsfeed.get", args);
|
||
connect(reply, SIGNAL(resultReady(QVariant)), SLOT(_q_news_received(QVariant)));
|
||
return reply;
|
||
}
|
||
|
||
} //namespace Vreen
|
||
|
||
#include "moc_newsfeed.cpp"
|
||
|