syntax = "proto3";

package xray.app.stats.command;
option csharp_namespace = "Xray.App.Stats.Command";
option go_package = "github.com/xtls/xray-core/app/stats/command";
option java_package = "com.xray.app.stats.command";
option java_multiple_files = true;

message GetStatsRequest {
  // Name of the stat counter.
  string name = 1;
  // Whether or not to reset the counter to fetching its value.
  bool reset = 2;
}

message Stat {
  string name = 1;
  int64 value = 2;
}

message GetStatsResponse {
  Stat stat = 1;
}

message QueryStatsRequest {
  string pattern = 1;
  bool reset = 2;
}

message QueryStatsResponse {
  repeated Stat stat = 1;
}

message SysStatsRequest {}

message SysStatsResponse {
  uint32 NumGoroutine = 1;
  uint32 NumGC = 2;
  uint64 Alloc = 3;
  uint64 TotalAlloc = 4;
  uint64 Sys = 5;
  uint64 Mallocs = 6;
  uint64 Frees = 7;
  uint64 LiveObjects = 8;
  uint64 PauseTotalNs = 9;
  uint32 Uptime = 10;
}

message GetStatsOnlineIpListResponse {
  string name = 1;
  map<string, int64> ips = 2;
}

message GetAllOnlineUsersRequest {}

message GetAllOnlineUsersResponse {
  repeated string users = 1;
}

message OnlineIPEntry {
  string ip = 1;
  int64 last_seen = 2;
}

message TrafficUserStat {
  int64 uplink = 1;
  int64 downlink = 2;
}

message UserStat {
  string email = 1;
  repeated OnlineIPEntry ips = 2;
  TrafficUserStat traffic = 3;
}

message GetUsersStatsRequest {
  bool include_traffic = 1;
  bool reset = 2;
}

message GetUsersStatsResponse {
  repeated UserStat users = 1;
}

service StatsService {
  rpc GetStats(GetStatsRequest) returns (GetStatsResponse) {}
  rpc GetStatsOnline(GetStatsRequest) returns (GetStatsResponse) {}
  rpc QueryStats(QueryStatsRequest) returns (QueryStatsResponse) {}
  rpc GetSysStats(SysStatsRequest) returns (SysStatsResponse) {}
  rpc GetStatsOnlineIpList(GetStatsRequest) returns (GetStatsOnlineIpListResponse) {}
  rpc GetAllOnlineUsers(GetAllOnlineUsersRequest) returns (GetAllOnlineUsersResponse) {}
  rpc GetUsersStats(GetUsersStatsRequest) returns (GetUsersStatsResponse) {}
}

message Config {}
