pub mod errors;
pub mod messages;
pub mod versions;
use std::fmt;
use std::u64;
use chrono::{DateTime, Utc};
use num_derive::{FromPrimitive, ToPrimitive};
use serde::de::{Unexpected, Visitor};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use tsproto::algorithms as algs;
use tsproto::crypto::EccKeyPrivP256;
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ClientId(pub u16);
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Uid(pub String);
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct UidRef<'a>(pub &'a str);
impl<'a> Into<Uid> for UidRef<'a> {
fn into(self) -> Uid { Uid(self.0.into()) }
}
impl Uid {
pub fn as_ref(&self) -> UidRef { UidRef(self.0.as_ref()) }
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ClientDbId(pub u64);
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ChannelId(pub u64);
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ServerGroupId(pub u64);
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ChannelGroupId(pub u64);
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct IconHash(pub u32);
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct Permission(pub u32);
impl Permission {
pub fn from_u32(i: u32) -> Option<Self> { Some(Permission(i)) }
pub fn to_u32(&self) -> Option<u32> { Some(self.0) }
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum PermissionType {
ServerGroup,
GlobalClient,
Channel,
ChannelGroup,
ChannelClient,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum TextMessageTargetMode {
Unknown,
Client,
Channel,
Server,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum HostMessageMode {
None,
Log,
Modal,
Modalquit,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum HostBannerMode {
NoAdjust,
AdjustIgnoreAspect,
AdjustKeepAspect,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum Codec {
SpeexNarrowband,
SpeexWideband,
SpeexUltrawideband,
CeltMono,
OpusVoice,
OpusMusic,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum CodecEncryptionMode {
PerChannel,
ForcedOff,
ForcedOn,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum Reason {
None,
Moved,
Subscription,
LostConnection,
KickChannel,
KickServer,
KickServerBan,
Serverstop,
Clientdisconnect,
Channelupdate,
Channeledit,
ClientdisconnectServerShutdown,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum ClientType {
Normal,
Query,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum GroupNamingMode {
None,
Before,
After,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum GroupType {
Template,
Regular,
Query,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum LicenseType {
NoLicense,
Athp,
Lan,
Npl,
Unknown,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum ChannelType {
Permanent,
SemiPermanent,
Temporary,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum TokenType {
ServerGroup,
ChannelGroup,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum PluginTargetMode {
CurrentChannel,
Server,
Client,
CurrentChannelSubsribedClients,
}
#[derive(
Debug, PartialEq, Eq, Clone, Copy, Hash, FromPrimitive, ToPrimitive,
)]
pub enum LogLevel {
Error = 1,
Warning,
Debug,
Info,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum MaxClients {
Unlimited,
Inherited,
Limited(u16),
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct TalkPowerRequest {
pub time: DateTime<Utc>,
pub message: String,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Invoker {
pub name: String,
pub id: ClientId,
pub uid: Option<Uid>,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct InvokerRef<'a> {
pub name: &'a str,
pub id: ClientId,
pub uid: Option<UidRef<'a>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Identity {
#[serde(
serialize_with = "serialize_id_key",
deserialize_with = "deserialize_id_key"
)]
key: EccKeyPrivP256,
counter: u64,
}
impl Invoker {
pub fn as_ref(&self) -> InvokerRef {
InvokerRef {
name: &self.name,
id: self.id,
uid: self.uid.as_ref().map(|u| u.as_ref()),
}
}
}
struct IdKeyVisitor;
impl<'de> Visitor<'de> for IdKeyVisitor {
type Value = EccKeyPrivP256;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "a P256 private ecc key")
}
fn visit_str<E: serde::de::Error>(
self,
s: &str,
) -> std::result::Result<Self::Value, E>
{
EccKeyPrivP256::import_str(s).map_err(|_| {
serde::de::Error::invalid_value(Unexpected::Str(s), &self)
})
}
}
fn serialize_id_key<S: Serializer>(
key: &EccKeyPrivP256,
s: S,
) -> std::result::Result<S::Ok, S::Error>
{
s.serialize_str(&base64::encode(&key.to_short()))
}
fn deserialize_id_key<'de, D: Deserializer<'de>>(
d: D,
) -> std::result::Result<EccKeyPrivP256, D::Error> {
d.deserialize_str(IdKeyVisitor)
}
impl Identity {
#[inline]
pub fn new(key: EccKeyPrivP256, counter: u64) -> Self {
Self { key, counter }
}
#[inline]
pub fn key(&self) -> &EccKeyPrivP256 { &self.key }
#[inline]
pub fn counter(&self) -> u64 { self.counter }
#[inline]
pub fn set_key(&mut self, key: EccKeyPrivP256) { self.key = key }
#[inline]
pub fn set_counter(&mut self, counter: u64) { self.counter = counter; }
#[inline]
pub fn level(&self) -> Result<u8, tsproto::Error> {
let omega = self.key.to_ts()?;
Ok(algs::get_hash_cash_level(&omega, self.counter))
}
pub fn upgrade_level(&mut self, target: u8) -> Result<(), tsproto::Error> {
let omega = self.key.to_ts()?;
let mut offset = self.counter;
while offset < u64::MAX
&& algs::get_hash_cash_level(&omega, offset) < target
{
offset += 1;
}
self.counter = offset;
Ok(())
}
}
impl fmt::Display for ClientId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl fmt::Display for Uid {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl fmt::Display for ClientDbId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl fmt::Display for ChannelId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl fmt::Display for ServerGroupId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl fmt::Display for ChannelGroupId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}