File: ankiconnector.cpp

package info (click to toggle)
goldendict-webengine 23.02.05-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 19,148 kB
  • sloc: cpp: 58,537; javascript: 9,942; ansic: 9,242; xml: 41; makefile: 15; sh: 9
file content (85 lines) | stat: -rw-r--r-- 3,162 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "ankiconnector.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include "utils.hh"
AnkiConnector::AnkiConnector( QObject * parent, Config::Class const & _cfg ) : QObject{ parent }, cfg( _cfg )
{
  mgr = new QNetworkAccessManager( this );
  connect( mgr, &QNetworkAccessManager::finished, this, &AnkiConnector::finishedSlot );
}

void AnkiConnector::sendToAnki( QString const & word, QString const & text )
{
  //for simplicity. maybe use QJsonDocument in future?
  QString postTemplate = QString( "{"
                                  "\"action\": \"addNote\","
                                  "\"version\": 6,"
                                  "\"params\": {"
                                  "   \"note\": {"
                                  "  \"deckName\": \"%1\","
                                  "  \"modelName\": \"%2\","
                                  "  \"fields\":%3,"
                                  "  \"options\": {"
                                  "    \"allowDuplicate\": true"
                                  "  },"
                                  "  \"tags\": []"
                                  "}"
                                  "}"
                                  "}"
                                  "" );

  QJsonObject fields;
  fields.insert( "Front", word );
  fields.insert( "Back", text );

  QString postData = postTemplate.arg( cfg.preferences.ankiConnectServer.deck,
                                       cfg.preferences.ankiConnectServer.model,
                                       Utils::json2String( fields ) );

//  qDebug().noquote() << postData;
  QUrl url;
  url.setScheme( "http" );
  url.setHost( cfg.preferences.ankiConnectServer.host );
  url.setPort( cfg.preferences.ankiConnectServer.port );
  QNetworkRequest request( url );
  request.setTransferTimeout( 3000 );
  //  request.setAttribute( QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy );
  request.setHeader( QNetworkRequest::ContentTypeHeader, "applicaion/json" );
  auto reply = mgr->post( request, postData.toUtf8() );
  connect( reply,
           &QNetworkReply::errorOccurred,
           this,
           [ this ]( QNetworkReply::NetworkError e )
           {
             qWarning() << e;
             emit this->errorText( tr( "anki: post to anki failed" ) );
           } );
}

void AnkiConnector::finishedSlot( QNetworkReply * reply )
{
  if( reply->error() == QNetworkReply::NoError )
  {
    QByteArray bytes   = reply->readAll();
    QJsonDocument json = QJsonDocument::fromJson( bytes );
    auto obj           = json.object();
    if( obj.size() != 2 || !obj.contains( "error" ) || !obj.contains( "result" ) ||
        obj[ "result" ].toString().isEmpty() )
    {
      emit errorText( QObject::tr( "anki: post to anki failed" ) );
    }
    QString result = obj[ "result" ].toString();

    qDebug() << "anki result:" << result;

    emit errorText( tr( "anki: post to anki success" ) );
  }
  else
  {
    qDebug() << "anki connect error" << reply->errorString();
    emit errorText( "anki:" + reply->errorString() );
  }

  reply->deleteLater();
}