mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 14:02:21 -04:00
190 lines
4.5 KiB
Protocol Buffer
190 lines
4.5 KiB
Protocol Buffer
// Copyright: Ankitects Pty Ltd and contributors
|
|
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
|
|
|
syntax = "proto3";
|
|
|
|
option java_multiple_files = true;
|
|
|
|
package anki.stats;
|
|
|
|
import "anki/generic.proto";
|
|
import "anki/cards.proto";
|
|
|
|
service StatsService {
|
|
rpc CardStats(cards.CardId) returns (CardStatsResponse);
|
|
rpc Graphs(GraphsRequest) returns (GraphsResponse);
|
|
rpc GetGraphPreferences(generic.Empty) returns (GraphPreferences);
|
|
rpc SetGraphPreferences(GraphPreferences) returns (generic.Empty);
|
|
}
|
|
|
|
// Implicitly includes any of the above methods that are not listed in the
|
|
// backend service.
|
|
service BackendStatsService {}
|
|
|
|
message CardStatsResponse {
|
|
message StatsRevlogEntry {
|
|
int64 time = 1;
|
|
RevlogEntry.ReviewKind review_kind = 2;
|
|
uint32 button_chosen = 3;
|
|
// seconds
|
|
uint32 interval = 4;
|
|
// per mill
|
|
uint32 ease = 5;
|
|
float taken_secs = 6;
|
|
}
|
|
repeated StatsRevlogEntry revlog = 1;
|
|
int64 card_id = 2;
|
|
int64 note_id = 3;
|
|
string deck = 4;
|
|
// Unix timestamps
|
|
int64 added = 5;
|
|
optional int64 first_review = 6;
|
|
optional int64 latest_review = 7;
|
|
optional int64 due_date = 8;
|
|
optional int32 due_position = 9;
|
|
// days
|
|
uint32 interval = 10;
|
|
// per mill
|
|
uint32 ease = 11;
|
|
uint32 reviews = 12;
|
|
uint32 lapses = 13;
|
|
float average_secs = 14;
|
|
float total_secs = 15;
|
|
string card_type = 16;
|
|
string notetype = 17;
|
|
optional cards.FsrsMemoryState memory_state = 18;
|
|
// not set if due date/state not available
|
|
optional float fsrs_retrievability = 19;
|
|
string custom_data = 20;
|
|
}
|
|
|
|
message GraphsRequest {
|
|
string search = 1;
|
|
uint32 days = 2;
|
|
}
|
|
|
|
message GraphsResponse {
|
|
message Added {
|
|
map<int32, uint32> added = 1;
|
|
}
|
|
message Intervals {
|
|
map<uint32, uint32> intervals = 1;
|
|
}
|
|
message Eases {
|
|
map<uint32, uint32> eases = 1;
|
|
}
|
|
message Retrievability {
|
|
map<uint32, uint32> retrievability = 1;
|
|
}
|
|
message FutureDue {
|
|
map<int32, uint32> future_due = 1;
|
|
bool have_backlog = 2;
|
|
}
|
|
message Today {
|
|
uint32 answer_count = 1;
|
|
uint32 answer_millis = 2;
|
|
uint32 correct_count = 3;
|
|
uint32 mature_correct = 4;
|
|
uint32 mature_count = 5;
|
|
uint32 learn_count = 6;
|
|
uint32 review_count = 7;
|
|
uint32 relearn_count = 8;
|
|
uint32 early_review_count = 9;
|
|
}
|
|
// each bucket is a 24 element vec
|
|
message Hours {
|
|
message Hour {
|
|
uint32 total = 1;
|
|
uint32 correct = 2;
|
|
}
|
|
repeated Hour one_month = 1;
|
|
repeated Hour three_months = 2;
|
|
repeated Hour one_year = 3;
|
|
repeated Hour all_time = 4;
|
|
}
|
|
message ReviewCountsAndTimes {
|
|
message Reviews {
|
|
uint32 learn = 1;
|
|
uint32 relearn = 2;
|
|
uint32 young = 3;
|
|
uint32 mature = 4;
|
|
uint32 filtered = 5;
|
|
}
|
|
map<int32, Reviews> count = 1;
|
|
map<int32, Reviews> time = 2;
|
|
}
|
|
// 4 element vecs for buttons 1-4
|
|
message Buttons {
|
|
message ButtonCounts {
|
|
repeated uint32 learning = 1;
|
|
repeated uint32 young = 2;
|
|
repeated uint32 mature = 3;
|
|
}
|
|
ButtonCounts one_month = 1;
|
|
ButtonCounts three_months = 2;
|
|
ButtonCounts one_year = 3;
|
|
ButtonCounts all_time = 4;
|
|
}
|
|
message CardCounts {
|
|
message Counts {
|
|
uint32 newCards = 1;
|
|
uint32 learn = 2;
|
|
uint32 relearn = 3;
|
|
uint32 young = 4;
|
|
uint32 mature = 5;
|
|
uint32 suspended = 6;
|
|
uint32 buried = 7;
|
|
}
|
|
// Buried/suspended cards are included in counts; suspended/buried counts
|
|
// are 0.
|
|
Counts including_inactive = 1;
|
|
// Buried/suspended cards are counted separately.
|
|
Counts excluding_inactive = 2;
|
|
}
|
|
|
|
Buttons buttons = 1;
|
|
CardCounts card_counts = 2;
|
|
Hours hours = 3;
|
|
Today today = 4;
|
|
Eases eases = 5;
|
|
Eases difficulty = 11;
|
|
Intervals intervals = 6;
|
|
FutureDue future_due = 7;
|
|
Added added = 8;
|
|
ReviewCountsAndTimes reviews = 9;
|
|
uint32 rollover_hour = 10;
|
|
Retrievability retrievability = 12;
|
|
}
|
|
|
|
message GraphPreferences {
|
|
enum Weekday {
|
|
SUNDAY = 0;
|
|
MONDAY = 1;
|
|
FRIDAY = 5;
|
|
SATURDAY = 6;
|
|
}
|
|
Weekday calendar_first_day_of_week = 1;
|
|
bool card_counts_separate_inactive = 2;
|
|
bool browser_links_supported = 3;
|
|
bool future_due_show_backlog = 4;
|
|
}
|
|
|
|
message RevlogEntry {
|
|
enum ReviewKind {
|
|
LEARNING = 0;
|
|
REVIEW = 1;
|
|
RELEARNING = 2;
|
|
// Recent Anki versions only use this when rescheduling disabled
|
|
FILTERED = 3;
|
|
MANUAL = 4;
|
|
}
|
|
int64 id = 1;
|
|
int64 cid = 2;
|
|
int32 usn = 3;
|
|
uint32 button_chosen = 4;
|
|
int32 interval = 5;
|
|
int32 last_interval = 6;
|
|
uint32 ease_factor = 7;
|
|
uint32 taken_millis = 8;
|
|
ReviewKind review_kind = 9;
|
|
}
|