Update euphoxide to version with id newtype wrappers
This commit is contained in:
parent
2d88513a28
commit
374c4c4f79
10 changed files with 131 additions and 114 deletions
|
|
@ -24,6 +24,7 @@ Procedure when bumping the version number:
|
||||||
### Fixed
|
### Fixed
|
||||||
- Cursor being visible through popups
|
- Cursor being visible through popups
|
||||||
- Cursor in lists when highlighted item moves off-screen
|
- Cursor in lists when highlighted item moves off-screen
|
||||||
|
- User disappearing from nick list when only one of their sessions disconnects
|
||||||
|
|
||||||
## v0.4.0 - 2022-09-01
|
## v0.4.0 - 2022-09-01
|
||||||
|
|
||||||
|
|
|
||||||
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -294,7 +294,7 @@ checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "euphoxide"
|
name = "euphoxide"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/Garmelon/euphoxide.git?rev=01a442c1f0695bd11b8f54db406b3a3a03d61983#01a442c1f0695bd11b8f54db406b3a3a03d61983"
|
source = "git+https://github.com/Garmelon/euphoxide.git?rev=e59216809a3d372b48681061a32b0e3e5973ce85#e59216809a3d372b48681061a32b0e3e5973ce85"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures",
|
"futures",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ features = ["rustls-tls-native-roots"]
|
||||||
|
|
||||||
[dependencies.euphoxide]
|
[dependencies.euphoxide]
|
||||||
git = "https://github.com/Garmelon/euphoxide.git"
|
git = "https://github.com/Garmelon/euphoxide.git"
|
||||||
rev = "01a442c1f0695bd11b8f54db406b3a3a03d61983"
|
rev = "e59216809a3d372b48681061a32b0e3e5973ce85"
|
||||||
|
|
||||||
# [patch."https://github.com/Garmelon/euphoxide.git"]
|
# [patch."https://github.com/Garmelon/euphoxide.git"]
|
||||||
# euphoxide = { path = "../euphoxide/" }
|
# euphoxide = { path = "../euphoxide/" }
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use anyhow::bail;
|
||||||
use cookie::{Cookie, CookieJar};
|
use cookie::{Cookie, CookieJar};
|
||||||
use euphoxide::api::packet::ParsedPacket;
|
use euphoxide::api::packet::ParsedPacket;
|
||||||
use euphoxide::api::{
|
use euphoxide::api::{
|
||||||
Auth, AuthOption, Data, Log, Login, Logout, Nick, Send, Snowflake, Time, UserId,
|
Auth, AuthOption, Data, Log, Login, Logout, MessageId, Nick, Send, Time, UserId,
|
||||||
};
|
};
|
||||||
use euphoxide::conn::{ConnRx, ConnTx, Joining, Status};
|
use euphoxide::conn::{ConnRx, ConnTx, Joining, Status};
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
|
|
@ -50,7 +50,7 @@ enum Event {
|
||||||
RequestLogs,
|
RequestLogs,
|
||||||
Auth(String),
|
Auth(String),
|
||||||
Nick(String),
|
Nick(String),
|
||||||
Send(Option<Snowflake>, String, oneshot::Sender<Snowflake>),
|
Send(Option<MessageId>, String, oneshot::Sender<MessageId>),
|
||||||
Login { email: String, password: String },
|
Login { email: String, password: String },
|
||||||
Logout,
|
Logout,
|
||||||
}
|
}
|
||||||
|
|
@ -66,7 +66,7 @@ struct State {
|
||||||
conn_tx: Option<ConnTx>,
|
conn_tx: Option<ConnTx>,
|
||||||
/// `None` before any `snapshot-event`, then either `Some(None)` or
|
/// `None` before any `snapshot-event`, then either `Some(None)` or
|
||||||
/// `Some(Some(id))`.
|
/// `Some(Some(id))`.
|
||||||
last_msg_id: Option<Option<Snowflake>>,
|
last_msg_id: Option<Option<MessageId>>,
|
||||||
requesting_logs: Arc<Mutex<bool>>,
|
requesting_logs: Arc<Mutex<bool>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -419,9 +419,9 @@ impl State {
|
||||||
|
|
||||||
fn on_send(
|
fn on_send(
|
||||||
&self,
|
&self,
|
||||||
parent: Option<Snowflake>,
|
parent: Option<MessageId>,
|
||||||
content: String,
|
content: String,
|
||||||
id_tx: oneshot::Sender<Snowflake>,
|
id_tx: oneshot::Sender<MessageId>,
|
||||||
) {
|
) {
|
||||||
if let Some(conn_tx) = &self.conn_tx {
|
if let Some(conn_tx) = &self.conn_tx {
|
||||||
let conn_tx = conn_tx.clone();
|
let conn_tx = conn_tx.clone();
|
||||||
|
|
@ -527,9 +527,9 @@ impl Room {
|
||||||
|
|
||||||
pub fn send(
|
pub fn send(
|
||||||
&self,
|
&self,
|
||||||
parent: Option<Snowflake>,
|
parent: Option<MessageId>,
|
||||||
content: String,
|
content: String,
|
||||||
) -> Result<oneshot::Receiver<Snowflake>, Error> {
|
) -> Result<oneshot::Receiver<MessageId>, Error> {
|
||||||
let (id_tx, id_rx) = oneshot::channel();
|
let (id_tx, id_rx) = oneshot::channel();
|
||||||
self.event_tx
|
self.event_tx
|
||||||
.send(Event::Send(parent, content, id_tx))
|
.send(Event::Send(parent, content, id_tx))
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crossterm::style::{Color, ContentStyle, Stylize};
|
use crossterm::style::{Color, ContentStyle, Stylize};
|
||||||
use euphoxide::api::{Snowflake, Time};
|
use euphoxide::api::{MessageId, Snowflake, Time};
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
use toss::styled::Styled;
|
use toss::styled::Styled;
|
||||||
|
|
||||||
|
|
@ -89,8 +89,8 @@ fn highlight_content(content: &str, base_style: ContentStyle) -> Styled {
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct SmallMessage {
|
pub struct SmallMessage {
|
||||||
pub id: Snowflake,
|
pub id: MessageId,
|
||||||
pub parent: Option<Snowflake>,
|
pub parent: Option<MessageId>,
|
||||||
pub time: Time,
|
pub time: Time,
|
||||||
pub nick: String,
|
pub nick: String,
|
||||||
pub content: String,
|
pub content: String,
|
||||||
|
|
@ -135,7 +135,7 @@ fn styled_editor_content(content: &str) -> Styled {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Msg for SmallMessage {
|
impl Msg for SmallMessage {
|
||||||
type Id = Snowflake;
|
type Id = MessageId;
|
||||||
|
|
||||||
fn id(&self) -> Self::Id {
|
fn id(&self) -> Self::Id {
|
||||||
self.id
|
self.id
|
||||||
|
|
@ -150,7 +150,7 @@ impl Msg for SmallMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn last_possible_id() -> Self::Id {
|
fn last_possible_id() -> Self::Id {
|
||||||
Snowflake::MAX
|
MessageId(Snowflake::MAX)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{BufWriter, Write};
|
use std::io::{BufWriter, Write};
|
||||||
|
|
||||||
use euphoxide::api::Snowflake;
|
use euphoxide::api::MessageId;
|
||||||
use time::format_description::FormatItem;
|
use time::format_description::FormatItem;
|
||||||
use time::macros::format_description;
|
use time::macros::format_description;
|
||||||
use unicode_width::UnicodeWidthStr;
|
use unicode_width::UnicodeWidthStr;
|
||||||
|
|
@ -41,7 +41,7 @@ pub async fn export_to_file(
|
||||||
fn write_tree(
|
fn write_tree(
|
||||||
file: &mut BufWriter<File>,
|
file: &mut BufWriter<File>,
|
||||||
tree: &Tree<SmallMessage>,
|
tree: &Tree<SmallMessage>,
|
||||||
id: Snowflake,
|
id: MessageId,
|
||||||
indent: usize,
|
indent: usize,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let indent_string = "| ".repeat(indent);
|
let indent_string = "| ".repeat(indent);
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ fn session_lines(mut text: Styled, session: &SessionView) -> Styled {
|
||||||
line!(text, "name (raw)", session.name, debug);
|
line!(text, "name (raw)", session.name, debug);
|
||||||
line!(text, "server_id", session.server_id);
|
line!(text, "server_id", session.server_id);
|
||||||
line!(text, "server_era", session.server_era);
|
line!(text, "server_era", session.server_era);
|
||||||
line!(text, "session_id", session.session_id);
|
line!(text, "session_id", session.session_id.0);
|
||||||
line!(text, "is_staff", session.is_staff, yes or no);
|
line!(text, "is_staff", session.is_staff, yes or no);
|
||||||
line!(text, "is_manager", session.is_manager, yes or no);
|
line!(text, "is_manager", session.is_manager, yes or no);
|
||||||
line!(
|
line!(
|
||||||
|
|
@ -64,8 +64,8 @@ fn session_lines(mut text: Styled, session: &SessionView) -> Styled {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn message_lines(mut text: Styled, msg: &Message) -> Styled {
|
fn message_lines(mut text: Styled, msg: &Message) -> Styled {
|
||||||
line!(text, "id", msg.id);
|
line!(text, "id", msg.id.0);
|
||||||
line!(text, "parent", msg.parent, optional);
|
line!(text, "parent", msg.parent.map(|p| p.0), optional);
|
||||||
line!(text, "previous_edit_id", msg.previous_edit_id, optional);
|
line!(text, "previous_edit_id", msg.previous_edit_id, optional);
|
||||||
line!(text, "time", msg.time.0);
|
line!(text, "time", msg.time.0);
|
||||||
line!(text, "encryption_key_id", &msg.encryption_key_id, optional);
|
line!(text, "encryption_key_id", &msg.encryption_key_id, optional);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
use crossterm::style::{Color, ContentStyle, Stylize};
|
use crossterm::style::{Color, ContentStyle, Stylize};
|
||||||
use euphoxide::api::{SessionType, SessionView, UserId};
|
use euphoxide::api::{SessionId, SessionType, SessionView};
|
||||||
use euphoxide::conn::Joined;
|
use euphoxide::conn::Joined;
|
||||||
use toss::styled::Styled;
|
use toss::styled::Styled;
|
||||||
|
|
||||||
|
|
@ -12,13 +12,13 @@ use crate::ui::widgets::list::{List, ListState};
|
||||||
use crate::ui::widgets::text::Text;
|
use crate::ui::widgets::text::Text;
|
||||||
use crate::ui::widgets::BoxedWidget;
|
use crate::ui::widgets::BoxedWidget;
|
||||||
|
|
||||||
pub fn widget(state: &ListState<UserId>, joined: &Joined, focused: bool) -> BoxedWidget {
|
pub fn widget(state: &ListState<SessionId>, joined: &Joined, focused: bool) -> BoxedWidget {
|
||||||
let mut list = state.widget().focus(focused);
|
let mut list = state.widget().focus(focused);
|
||||||
render_rows(&mut list, joined);
|
render_rows(&mut list, joined);
|
||||||
list.into()
|
list.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_rows(list: &mut List<UserId>, joined: &Joined) {
|
fn render_rows(list: &mut List<SessionId>, joined: &Joined) {
|
||||||
let mut people = vec![];
|
let mut people = vec![];
|
||||||
let mut bots = vec![];
|
let mut bots = vec![];
|
||||||
let mut lurkers = vec![];
|
let mut lurkers = vec![];
|
||||||
|
|
@ -49,7 +49,7 @@ fn render_rows(list: &mut List<UserId>, joined: &Joined) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_section(
|
fn render_section(
|
||||||
list: &mut List<UserId>,
|
list: &mut List<SessionId>,
|
||||||
name: &str,
|
name: &str,
|
||||||
sessions: &[&SessionView],
|
sessions: &[&SessionView],
|
||||||
own_session: &SessionView,
|
own_session: &SessionView,
|
||||||
|
|
@ -74,7 +74,7 @@ fn render_section(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_row(list: &mut List<UserId>, session: &SessionView, own_session: &SessionView) {
|
fn render_row(list: &mut List<SessionId>, session: &SessionView, own_session: &SessionView) {
|
||||||
let (name, style, style_inv, perms_style_inv) = if session.name.is_empty() {
|
let (name, style, style_inv, perms_style_inv) = if session.name.is_empty() {
|
||||||
let name = "lurk";
|
let name = "lurk";
|
||||||
let style = ContentStyle::default().grey();
|
let style = ContentStyle::default().grey();
|
||||||
|
|
@ -111,7 +111,7 @@ fn render_row(list: &mut List<UserId>, session: &SessionView, own_session: &Sess
|
||||||
.then(name, style_inv)
|
.then(name, style_inv)
|
||||||
.then(perms, perms_style_inv);
|
.then(perms, perms_style_inv);
|
||||||
list.add_sel(
|
list.add_sel(
|
||||||
session.id.clone(),
|
session.session_id.clone(),
|
||||||
Text::new(normal),
|
Text::new(normal),
|
||||||
Background::new(Text::new(selected)).style(style_inv),
|
Background::new(Text::new(selected)).style(style_inv),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use std::collections::VecDeque;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crossterm::style::{ContentStyle, Stylize};
|
use crossterm::style::{ContentStyle, Stylize};
|
||||||
use euphoxide::api::{Data, Message, PacketType, SessionView, Snowflake, UserId};
|
use euphoxide::api::{Data, Message, MessageId, PacketType, SessionId, SessionView};
|
||||||
use euphoxide::conn::{Joined, Joining, Status};
|
use euphoxide::conn::{Joined, Joining, Status};
|
||||||
use parking_lot::FairMutex;
|
use parking_lot::FairMutex;
|
||||||
use tokio::sync::oneshot::error::TryRecvError;
|
use tokio::sync::oneshot::error::TryRecvError;
|
||||||
|
|
@ -78,9 +78,9 @@ pub struct EuphRoom {
|
||||||
popups: VecDeque<RoomPopup>,
|
popups: VecDeque<RoomPopup>,
|
||||||
|
|
||||||
chat: ChatState<euph::SmallMessage, EuphRoomVault>,
|
chat: ChatState<euph::SmallMessage, EuphRoomVault>,
|
||||||
last_msg_sent: Option<oneshot::Receiver<Snowflake>>,
|
last_msg_sent: Option<oneshot::Receiver<MessageId>>,
|
||||||
|
|
||||||
nick_list: ListState<UserId>,
|
nick_list: ListState<SessionId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EuphRoom {
|
impl EuphRoom {
|
||||||
|
|
@ -501,7 +501,7 @@ impl EuphRoom {
|
||||||
if let RoomStatus::Connected(Status::Joined(joined)) = status {
|
if let RoomStatus::Connected(Status::Joined(joined)) = status {
|
||||||
// TODO Fix euphoxide to use session_id as hash
|
// TODO Fix euphoxide to use session_id as hash
|
||||||
if let Some(id) = self.nick_list.cursor() {
|
if let Some(id) = self.nick_list.cursor() {
|
||||||
if id == joined.session.id {
|
if id == joined.session.session_id {
|
||||||
self.state = State::InspectSession(joined.session.clone());
|
self.state = State::InspectSession(joined.session.clone());
|
||||||
} else if let Some(session) = joined.listing.get(&id) {
|
} else if let Some(session) = joined.listing.get(&id) {
|
||||||
self.state = State::InspectSession(session.clone());
|
self.state = State::InspectSession(session.clone());
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ use std::str::FromStr;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use cookie::{Cookie, CookieJar};
|
use cookie::{Cookie, CookieJar};
|
||||||
use euphoxide::api::{Message, SessionView, Snowflake, Time, UserId};
|
use euphoxide::api::{Message, MessageId, SessionId, SessionView, Snowflake, Time, UserId};
|
||||||
use rusqlite::types::{FromSql, FromSqlError, ToSqlOutput, Value, ValueRef};
|
use rusqlite::types::{FromSql, FromSqlError, ToSqlOutput, Value, ValueRef};
|
||||||
use rusqlite::{named_params, params, Connection, OptionalExtension, ToSql, Transaction};
|
use rusqlite::{named_params, params, Connection, OptionalExtension, ToSql, Transaction};
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
|
|
@ -86,63 +86,63 @@ impl EuphRoomVault {
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl MsgStore<SmallMessage> for EuphRoomVault {
|
impl MsgStore<SmallMessage> for EuphRoomVault {
|
||||||
async fn path(&self, id: &Snowflake) -> Path<Snowflake> {
|
async fn path(&self, id: &MessageId) -> Path<MessageId> {
|
||||||
self.path(*id).await
|
self.path(*id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn msg(&self, id: &Snowflake) -> Option<SmallMessage> {
|
async fn msg(&self, id: &MessageId) -> Option<SmallMessage> {
|
||||||
self.msg(*id).await
|
self.msg(*id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn tree(&self, root_id: &Snowflake) -> Tree<SmallMessage> {
|
async fn tree(&self, root_id: &MessageId) -> Tree<SmallMessage> {
|
||||||
self.tree(*root_id).await
|
self.tree(*root_id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn first_root_id(&self) -> Option<Snowflake> {
|
async fn first_root_id(&self) -> Option<MessageId> {
|
||||||
self.first_root_id().await
|
self.first_root_id().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn last_root_id(&self) -> Option<Snowflake> {
|
async fn last_root_id(&self) -> Option<MessageId> {
|
||||||
self.last_root_id().await
|
self.last_root_id().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn prev_root_id(&self, root_id: &Snowflake) -> Option<Snowflake> {
|
async fn prev_root_id(&self, root_id: &MessageId) -> Option<MessageId> {
|
||||||
self.prev_root_id(*root_id).await
|
self.prev_root_id(*root_id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn next_root_id(&self, root_id: &Snowflake) -> Option<Snowflake> {
|
async fn next_root_id(&self, root_id: &MessageId) -> Option<MessageId> {
|
||||||
self.next_root_id(*root_id).await
|
self.next_root_id(*root_id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn oldest_msg_id(&self) -> Option<Snowflake> {
|
async fn oldest_msg_id(&self) -> Option<MessageId> {
|
||||||
self.oldest_msg_id().await
|
self.oldest_msg_id().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn newest_msg_id(&self) -> Option<Snowflake> {
|
async fn newest_msg_id(&self) -> Option<MessageId> {
|
||||||
self.newest_msg_id().await
|
self.newest_msg_id().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn older_msg_id(&self, id: &Snowflake) -> Option<Snowflake> {
|
async fn older_msg_id(&self, id: &MessageId) -> Option<MessageId> {
|
||||||
self.older_msg_id(*id).await
|
self.older_msg_id(*id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn newer_msg_id(&self, id: &Snowflake) -> Option<Snowflake> {
|
async fn newer_msg_id(&self, id: &MessageId) -> Option<MessageId> {
|
||||||
self.newer_msg_id(*id).await
|
self.newer_msg_id(*id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn oldest_unseen_msg_id(&self) -> Option<Snowflake> {
|
async fn oldest_unseen_msg_id(&self) -> Option<MessageId> {
|
||||||
self.oldest_unseen_msg_id().await
|
self.oldest_unseen_msg_id().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn newest_unseen_msg_id(&self) -> Option<Snowflake> {
|
async fn newest_unseen_msg_id(&self) -> Option<MessageId> {
|
||||||
self.newest_unseen_msg_id().await
|
self.newest_unseen_msg_id().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn older_unseen_msg_id(&self, id: &Snowflake) -> Option<Snowflake> {
|
async fn older_unseen_msg_id(&self, id: &MessageId) -> Option<MessageId> {
|
||||||
self.older_unseen_msg_id(*id).await
|
self.older_unseen_msg_id(*id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn newer_unseen_msg_id(&self, id: &Snowflake) -> Option<Snowflake> {
|
async fn newer_unseen_msg_id(&self, id: &MessageId) -> Option<MessageId> {
|
||||||
self.newer_unseen_msg_id(*id).await
|
self.newer_unseen_msg_id(*id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -150,11 +150,11 @@ impl MsgStore<SmallMessage> for EuphRoomVault {
|
||||||
self.unseen_msgs_count().await
|
self.unseen_msgs_count().await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn set_seen(&self, id: &Snowflake, seen: bool) {
|
async fn set_seen(&self, id: &MessageId, seen: bool) {
|
||||||
self.set_seen(*id, seen);
|
self.set_seen(*id, seen);
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn set_older_seen(&self, id: &Snowflake, seen: bool) {
|
async fn set_older_seen(&self, id: &MessageId, seen: bool) {
|
||||||
self.set_older_seen(*id, seen);
|
self.set_older_seen(*id, seen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -247,28 +247,28 @@ requests! {
|
||||||
Delete : delete(room: String);
|
Delete : delete(room: String);
|
||||||
|
|
||||||
// Message
|
// Message
|
||||||
AddMsg : add_msg(room: String, msg: Box<Message>, prev_msg_id: Option<Snowflake>, own_user_id: Option<UserId>);
|
AddMsg : add_msg(room: String, msg: Box<Message>, prev_msg_id: Option<MessageId>, own_user_id: Option<UserId>);
|
||||||
AddMsgs : add_msgs(room: String, msgs: Vec<Message>, next_msg_id: Option<Snowflake>, own_user_id: Option<UserId>);
|
AddMsgs : add_msgs(room: String, msgs: Vec<Message>, next_msg_id: Option<MessageId>, own_user_id: Option<UserId>);
|
||||||
GetLastSpan : last_span(room: String) -> Option<(Option<Snowflake>, Option<Snowflake>)>;
|
GetLastSpan : last_span(room: String) -> Option<(Option<MessageId>, Option<MessageId>)>;
|
||||||
GetPath : path(room: String, id: Snowflake) -> Path<Snowflake>;
|
GetPath : path(room: String, id: MessageId) -> Path<MessageId>;
|
||||||
GetMsg : msg(room: String, id: Snowflake) -> Option<SmallMessage>;
|
GetMsg : msg(room: String, id: MessageId) -> Option<SmallMessage>;
|
||||||
GetFullMsg : full_msg(room: String, id: Snowflake) -> Option<Message>;
|
GetFullMsg : full_msg(room: String, id: MessageId) -> Option<Message>;
|
||||||
GetTree : tree(room: String, root_id: Snowflake) -> Tree<SmallMessage>;
|
GetTree : tree(room: String, root_id: MessageId) -> Tree<SmallMessage>;
|
||||||
GetFirstRootId : first_root_id(room: String) -> Option<Snowflake>;
|
GetFirstRootId : first_root_id(room: String) -> Option<MessageId>;
|
||||||
GetLastRootId : last_root_id(room: String) -> Option<Snowflake>;
|
GetLastRootId : last_root_id(room: String) -> Option<MessageId>;
|
||||||
GetPrevRootId : prev_root_id(room: String, root_id: Snowflake) -> Option<Snowflake>;
|
GetPrevRootId : prev_root_id(room: String, root_id: MessageId) -> Option<MessageId>;
|
||||||
GetNextRootId : next_root_id(room: String, root_id: Snowflake) -> Option<Snowflake>;
|
GetNextRootId : next_root_id(room: String, root_id: MessageId) -> Option<MessageId>;
|
||||||
GetOldestMsgId : oldest_msg_id(room: String) -> Option<Snowflake>;
|
GetOldestMsgId : oldest_msg_id(room: String) -> Option<MessageId>;
|
||||||
GetNewestMsgId : newest_msg_id(room: String) -> Option<Snowflake>;
|
GetNewestMsgId : newest_msg_id(room: String) -> Option<MessageId>;
|
||||||
GetOlderMsgId : older_msg_id(room: String, id: Snowflake) -> Option<Snowflake>;
|
GetOlderMsgId : older_msg_id(room: String, id: MessageId) -> Option<MessageId>;
|
||||||
GetNewerMsgId : newer_msg_id(room: String, id: Snowflake) -> Option<Snowflake>;
|
GetNewerMsgId : newer_msg_id(room: String, id: MessageId) -> Option<MessageId>;
|
||||||
GetOldestUnseenMsgId : oldest_unseen_msg_id(room: String) -> Option<Snowflake>;
|
GetOldestUnseenMsgId : oldest_unseen_msg_id(room: String) -> Option<MessageId>;
|
||||||
GetNewestUnseenMsgId : newest_unseen_msg_id(room: String) -> Option<Snowflake>;
|
GetNewestUnseenMsgId : newest_unseen_msg_id(room: String) -> Option<MessageId>;
|
||||||
GetOlderUnseenMsgId : older_unseen_msg_id(room: String, id: Snowflake) -> Option<Snowflake>;
|
GetOlderUnseenMsgId : older_unseen_msg_id(room: String, id: MessageId) -> Option<MessageId>;
|
||||||
GetNewerUnseenMsgId : newer_unseen_msg_id(room: String, id: Snowflake) -> Option<Snowflake>;
|
GetNewerUnseenMsgId : newer_unseen_msg_id(room: String, id: MessageId) -> Option<MessageId>;
|
||||||
GetUnseenMsgsCount : unseen_msgs_count(room: String) -> usize;
|
GetUnseenMsgsCount : unseen_msgs_count(room: String) -> usize;
|
||||||
SetSeen : set_seen(room: String, id: Snowflake, seen: bool);
|
SetSeen : set_seen(room: String, id: MessageId, seen: bool);
|
||||||
SetOlderSeen : set_older_seen(room: String, id: Snowflake, seen: bool);
|
SetOlderSeen : set_older_seen(room: String, id: MessageId, seen: bool);
|
||||||
GetChunkAtOffset : chunk_at_offset(room: String, amount: usize, offset: usize) -> Vec<Message>;
|
GetChunkAtOffset : chunk_at_offset(room: String, amount: usize, offset: usize) -> Vec<Message>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -417,8 +417,8 @@ fn insert_msgs(
|
||||||
for msg in msgs {
|
for msg in msgs {
|
||||||
insert_msg.execute(named_params! {
|
insert_msg.execute(named_params! {
|
||||||
":room": room,
|
":room": room,
|
||||||
":id": WSnowflake(msg.id),
|
":id": WSnowflake(msg.id.0),
|
||||||
":parent": msg.parent.map(WSnowflake),
|
":parent": msg.parent.map(|id| WSnowflake(id.0)),
|
||||||
":previous_edit_id": msg.previous_edit_id.map(WSnowflake),
|
":previous_edit_id": msg.previous_edit_id.map(WSnowflake),
|
||||||
":time": WTime(msg.time),
|
":time": WTime(msg.time),
|
||||||
":content": msg.content,
|
":content": msg.content,
|
||||||
|
|
@ -430,7 +430,7 @@ fn insert_msgs(
|
||||||
":name": msg.sender.name,
|
":name": msg.sender.name,
|
||||||
":server_id": msg.sender.server_id,
|
":server_id": msg.sender.server_id,
|
||||||
":server_era": msg.sender.server_era,
|
":server_era": msg.sender.server_era,
|
||||||
":session_id": msg.sender.session_id,
|
":session_id": msg.sender.session_id.0,
|
||||||
":is_staff": msg.sender.is_staff,
|
":is_staff": msg.sender.is_staff,
|
||||||
":is_manager": msg.sender.is_manager,
|
":is_manager": msg.sender.is_manager,
|
||||||
":client_address": msg.sender.client_address,
|
":client_address": msg.sender.client_address,
|
||||||
|
|
@ -445,8 +445,8 @@ fn insert_msgs(
|
||||||
fn add_span(
|
fn add_span(
|
||||||
tx: &Transaction<'_>,
|
tx: &Transaction<'_>,
|
||||||
room: &str,
|
room: &str,
|
||||||
start: Option<Snowflake>,
|
start: Option<MessageId>,
|
||||||
end: Option<Snowflake>,
|
end: Option<MessageId>,
|
||||||
) -> rusqlite::Result<()> {
|
) -> rusqlite::Result<()> {
|
||||||
// Retrieve all spans for the room
|
// Retrieve all spans for the room
|
||||||
let mut spans = tx
|
let mut spans = tx
|
||||||
|
|
@ -458,8 +458,8 @@ fn add_span(
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_map([room], |row| {
|
.query_map([room], |row| {
|
||||||
let start = row.get::<_, Option<WSnowflake>>(0)?.map(|s| s.0);
|
let start = row.get::<_, Option<WSnowflake>>(0)?.map(|s| MessageId(s.0));
|
||||||
let end = row.get::<_, Option<WSnowflake>>(1)?.map(|s| s.0);
|
let end = row.get::<_, Option<WSnowflake>>(1)?.map(|s| MessageId(s.0));
|
||||||
Ok((start, end))
|
Ok((start, end))
|
||||||
})?
|
})?
|
||||||
.collect::<Result<Vec<_>, _>>()?;
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
@ -469,7 +469,7 @@ fn add_span(
|
||||||
spans.sort_unstable();
|
spans.sort_unstable();
|
||||||
|
|
||||||
// Combine overlapping spans (including newly added span)
|
// Combine overlapping spans (including newly added span)
|
||||||
let mut cur_span: Option<(Option<Snowflake>, Option<Snowflake>)> = None;
|
let mut cur_span: Option<(Option<MessageId>, Option<MessageId>)> = None;
|
||||||
let mut result = vec![];
|
let mut result = vec![];
|
||||||
for mut span in spans {
|
for mut span in spans {
|
||||||
if let Some(cur_span) = &mut cur_span {
|
if let Some(cur_span) = &mut cur_span {
|
||||||
|
|
@ -510,7 +510,11 @@ fn add_span(
|
||||||
",
|
",
|
||||||
)?;
|
)?;
|
||||||
for (start, end) in result {
|
for (start, end) in result {
|
||||||
stmt.execute(params![room, start.map(WSnowflake), end.map(WSnowflake)])?;
|
stmt.execute(params![
|
||||||
|
room,
|
||||||
|
start.map(|id| WSnowflake(id.0)),
|
||||||
|
end.map(|id| WSnowflake(id.0))
|
||||||
|
])?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -564,8 +568,8 @@ impl Request for GetLastSpan {
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| {
|
.query_row([self.room], |row| {
|
||||||
Ok((
|
Ok((
|
||||||
row.get::<_, Option<WSnowflake>>(0)?.map(|s| s.0),
|
row.get::<_, Option<WSnowflake>>(0)?.map(|s| MessageId(s.0)),
|
||||||
row.get::<_, Option<WSnowflake>>(1)?.map(|s| s.0),
|
row.get::<_, Option<WSnowflake>>(1)?.map(|s| MessageId(s.0)),
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
|
|
@ -593,8 +597,8 @@ impl Request for GetPath {
|
||||||
ORDER BY id ASC
|
ORDER BY id ASC
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_map(params![self.room, WSnowflake(self.id)], |row| {
|
.query_map(params![self.room, WSnowflake(self.id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})?
|
})?
|
||||||
.collect::<rusqlite::Result<_>>()?;
|
.collect::<rusqlite::Result<_>>()?;
|
||||||
let path = Path::new(path);
|
let path = Path::new(path);
|
||||||
|
|
@ -613,11 +617,11 @@ impl Request for GetMsg {
|
||||||
WHERE room = ?
|
WHERE room = ?
|
||||||
AND id = ?
|
AND id = ?
|
||||||
",
|
",
|
||||||
params![self.room, WSnowflake(self.id)],
|
params![self.room, WSnowflake(self.id.0)],
|
||||||
|row| {
|
|row| {
|
||||||
Ok(SmallMessage {
|
Ok(SmallMessage {
|
||||||
id: row.get::<_, WSnowflake>(0)?.0,
|
id: MessageId(row.get::<_, WSnowflake>(0)?.0),
|
||||||
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| s.0),
|
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| MessageId(s.0)),
|
||||||
time: row.get::<_, WTime>(2)?.0,
|
time: row.get::<_, WTime>(2)?.0,
|
||||||
nick: row.get(3)?,
|
nick: row.get(3)?,
|
||||||
content: row.get(4)?,
|
content: row.get(4)?,
|
||||||
|
|
@ -645,10 +649,10 @@ impl Request for GetFullMsg {
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let msg = query
|
let msg = query
|
||||||
.query_row(params![self.room, WSnowflake(self.id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.id.0)], |row| {
|
||||||
Ok(Message {
|
Ok(Message {
|
||||||
id: row.get::<_, WSnowflake>(0)?.0,
|
id: MessageId(row.get::<_, WSnowflake>(0)?.0),
|
||||||
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| s.0),
|
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| MessageId(s.0)),
|
||||||
previous_edit_id: row.get::<_, Option<WSnowflake>>(2)?.map(|s| s.0),
|
previous_edit_id: row.get::<_, Option<WSnowflake>>(2)?.map(|s| s.0),
|
||||||
time: row.get::<_, WTime>(3)?.0,
|
time: row.get::<_, WTime>(3)?.0,
|
||||||
content: row.get(4)?,
|
content: row.get(4)?,
|
||||||
|
|
@ -661,7 +665,7 @@ impl Request for GetFullMsg {
|
||||||
name: row.get(10)?,
|
name: row.get(10)?,
|
||||||
server_id: row.get(11)?,
|
server_id: row.get(11)?,
|
||||||
server_era: row.get(12)?,
|
server_era: row.get(12)?,
|
||||||
session_id: row.get(13)?,
|
session_id: SessionId(row.get(13)?),
|
||||||
is_staff: row.get(14)?,
|
is_staff: row.get(14)?,
|
||||||
is_manager: row.get(15)?,
|
is_manager: row.get(15)?,
|
||||||
client_address: row.get(16)?,
|
client_address: row.get(16)?,
|
||||||
|
|
@ -696,10 +700,10 @@ impl Request for GetTree {
|
||||||
ORDER BY id ASC
|
ORDER BY id ASC
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_map(params![self.room, WSnowflake(self.root_id)], |row| {
|
.query_map(params![self.room, WSnowflake(self.root_id.0)], |row| {
|
||||||
Ok(SmallMessage {
|
Ok(SmallMessage {
|
||||||
id: row.get::<_, WSnowflake>(0)?.0,
|
id: MessageId(row.get::<_, WSnowflake>(0)?.0),
|
||||||
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| s.0),
|
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| MessageId(s.0)),
|
||||||
time: row.get::<_, WTime>(2)?.0,
|
time: row.get::<_, WTime>(2)?.0,
|
||||||
nick: row.get(3)?,
|
nick: row.get(3)?,
|
||||||
content: row.get(4)?,
|
content: row.get(4)?,
|
||||||
|
|
@ -725,7 +729,9 @@ impl Request for GetFirstRootId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| row.get::<_, WSnowflake>(0).map(|s| s.0))
|
.query_row([self.room], |row| {
|
||||||
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -744,7 +750,9 @@ impl Request for GetLastRootId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| row.get::<_, WSnowflake>(0).map(|s| s.0))
|
.query_row([self.room], |row| {
|
||||||
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -764,8 +772,8 @@ impl Request for GetPrevRootId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row(params![self.room, WSnowflake(self.root_id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.root_id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
|
|
@ -786,8 +794,8 @@ impl Request for GetNextRootId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row(params![self.room, WSnowflake(self.root_id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.root_id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
|
|
@ -807,7 +815,9 @@ impl Request for GetOldestMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| row.get::<_, WSnowflake>(0).map(|s| s.0))
|
.query_row([self.room], |row| {
|
||||||
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -826,7 +836,9 @@ impl Request for GetNewestMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| row.get::<_, WSnowflake>(0).map(|s| s.0))
|
.query_row([self.room], |row| {
|
||||||
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -846,8 +858,8 @@ impl Request for GetOlderMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row(params![self.room, WSnowflake(self.id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
|
|
@ -867,8 +879,8 @@ impl Request for GetNewerMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row(params![self.room, WSnowflake(self.id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
|
|
@ -889,7 +901,9 @@ impl Request for GetOldestUnseenMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| row.get::<_, WSnowflake>(0).map(|s| s.0))
|
.query_row([self.room], |row| {
|
||||||
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -909,7 +923,9 @@ impl Request for GetNewestUnseenMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row([self.room], |row| row.get::<_, WSnowflake>(0).map(|s| s.0))
|
.query_row([self.room], |row| {
|
||||||
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
@ -930,8 +946,8 @@ impl Request for GetOlderUnseenMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row(params![self.room, WSnowflake(self.id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
|
|
@ -953,8 +969,8 @@ impl Request for GetNewerUnseenMsgId {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
",
|
",
|
||||||
)?
|
)?
|
||||||
.query_row(params![self.room, WSnowflake(self.id)], |row| {
|
.query_row(params![self.room, WSnowflake(self.id.0)], |row| {
|
||||||
row.get::<_, WSnowflake>(0).map(|s| s.0)
|
row.get::<_, WSnowflake>(0).map(|s| MessageId(s.0))
|
||||||
})
|
})
|
||||||
.optional()?;
|
.optional()?;
|
||||||
let _ = self.result.send(tree);
|
let _ = self.result.send(tree);
|
||||||
|
|
@ -989,7 +1005,7 @@ impl Request for SetSeen {
|
||||||
WHERE room = :room
|
WHERE room = :room
|
||||||
AND id = :id
|
AND id = :id
|
||||||
",
|
",
|
||||||
named_params! { ":room": self.room, ":id": WSnowflake(self.id), ":seen": self.seen },
|
named_params! { ":room": self.room, ":id": WSnowflake(self.id.0), ":seen": self.seen },
|
||||||
)?;
|
)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
@ -1005,7 +1021,7 @@ impl Request for SetOlderSeen {
|
||||||
AND id <= :id
|
AND id <= :id
|
||||||
AND seen != :seen
|
AND seen != :seen
|
||||||
",
|
",
|
||||||
named_params! { ":room": self.room, ":id": WSnowflake(self.id), ":seen": self.seen },
|
named_params! { ":room": self.room, ":id": WSnowflake(self.id.0), ":seen": self.seen },
|
||||||
)?;
|
)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
@ -1029,8 +1045,8 @@ impl Request for GetChunkAtOffset {
|
||||||
let messages = query
|
let messages = query
|
||||||
.query_map(params![self.room, self.amount, self.offset], |row| {
|
.query_map(params![self.room, self.amount, self.offset], |row| {
|
||||||
Ok(Message {
|
Ok(Message {
|
||||||
id: row.get::<_, WSnowflake>(0)?.0,
|
id: MessageId(row.get::<_, WSnowflake>(0)?.0),
|
||||||
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| s.0),
|
parent: row.get::<_, Option<WSnowflake>>(1)?.map(|s| MessageId(s.0)),
|
||||||
previous_edit_id: row.get::<_, Option<WSnowflake>>(2)?.map(|s| s.0),
|
previous_edit_id: row.get::<_, Option<WSnowflake>>(2)?.map(|s| s.0),
|
||||||
time: row.get::<_, WTime>(3)?.0,
|
time: row.get::<_, WTime>(3)?.0,
|
||||||
content: row.get(4)?,
|
content: row.get(4)?,
|
||||||
|
|
@ -1043,7 +1059,7 @@ impl Request for GetChunkAtOffset {
|
||||||
name: row.get(10)?,
|
name: row.get(10)?,
|
||||||
server_id: row.get(11)?,
|
server_id: row.get(11)?,
|
||||||
server_era: row.get(12)?,
|
server_era: row.get(12)?,
|
||||||
session_id: row.get(13)?,
|
session_id: SessionId(row.get(13)?),
|
||||||
is_staff: row.get(14)?,
|
is_staff: row.get(14)?,
|
||||||
is_manager: row.get(15)?,
|
is_manager: row.get(15)?,
|
||||||
client_address: row.get(16)?,
|
client_address: row.get(16)?,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue