forked from jmug/stoatchat
Compare commits
5
Commits
20240611-1
...
20240611-3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
962c7d62c7 | ||
|
|
d677716f93 | ||
|
|
8099310f89 | ||
|
|
5c40f66010 | ||
|
|
8e7dd21bce |
No files matched your search
@@ -48,7 +48,29 @@ cp .env.example .env
|
|||||||
# (optionally) copy the default configuration file
|
# (optionally) copy the default configuration file
|
||||||
cp crates/core/config/Revolt.toml Revolt.toml
|
cp crates/core/config/Revolt.toml Revolt.toml
|
||||||
# configure as necessary...
|
# configure as necessary...
|
||||||
|
```
|
||||||
|
|
||||||
|
You may want to copy the following configuration:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
# Revolt.toml
|
||||||
|
[database]
|
||||||
|
mongodb = "mongodb://localhost"
|
||||||
|
redis = "redis://localhost"
|
||||||
|
|
||||||
|
[hosts]
|
||||||
|
app = "http://local.revolt.chat"
|
||||||
|
api = "http://local.revolt.chat:8000"
|
||||||
|
events = "ws://local.revolt.chat:9000"
|
||||||
|
autumn = "http://local.revolt.chat:3000"
|
||||||
|
january = "http://local.revolt.chat:7000"
|
||||||
|
voso_legacy = ""
|
||||||
|
voso_legacy_ws = ""
|
||||||
|
```
|
||||||
|
|
||||||
|
Then continue:
|
||||||
|
|
||||||
|
```bash
|
||||||
# start other necessary services
|
# start other necessary services
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|
||||||
@@ -105,6 +127,8 @@ Tag and push a new release by running:
|
|||||||
just release
|
just release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you have bumped the crate versions, proceed to [GitHub releases](https://github.com/revoltchat/backend/releases/new) to create a changelog.
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
First, start the required services:
|
First, start the required services:
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ impl Cache {
|
|||||||
let server = self.servers.get(server);
|
let server = self.servers.get(server);
|
||||||
let mut query =
|
let mut query =
|
||||||
DatabasePermissionQuery::new(db, self.users.get(&self.user_id).unwrap())
|
DatabasePermissionQuery::new(db, self.users.get(&self.user_id).unwrap())
|
||||||
.channel(&channel);
|
.channel(channel);
|
||||||
// let mut perms = perms(self.users.get(&self.user_id).unwrap()).channel(channel);
|
// let mut perms = perms(self.users.get(&self.user_id).unwrap()).channel(channel);
|
||||||
|
|
||||||
if let Some(member) = member {
|
if let Some(member) = member {
|
||||||
query = query.member(&member);
|
query = query.member(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(server) = server {
|
if let Some(server) = server {
|
||||||
@@ -182,19 +182,19 @@ impl State {
|
|||||||
users.push(user.into_self().await);
|
users.push(user.into_self().await);
|
||||||
|
|
||||||
// Set subscription state internally.
|
// Set subscription state internally.
|
||||||
self.reset_state();
|
self.reset_state().await;
|
||||||
self.insert_subscription(self.private_topic.clone());
|
self.insert_subscription(self.private_topic.clone()).await;
|
||||||
|
|
||||||
for user in &users {
|
for user in &users {
|
||||||
self.insert_subscription(user.id.clone());
|
self.insert_subscription(user.id.clone()).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
for server in &servers {
|
for server in &servers {
|
||||||
self.insert_subscription(server.id.clone());
|
self.insert_subscription(server.id.clone()).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
for channel in &channels {
|
for channel in &channels {
|
||||||
self.insert_subscription(channel.id().to_string());
|
self.insert_subscription(channel.id().to_string()).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(EventV1::Ready {
|
Ok(EventV1::Ready {
|
||||||
@@ -236,11 +236,11 @@ impl State {
|
|||||||
let mut bulk_events = vec![];
|
let mut bulk_events = vec![];
|
||||||
|
|
||||||
for id in added_channels {
|
for id in added_channels {
|
||||||
self.insert_subscription(id);
|
self.insert_subscription(id).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
for id in removed_channels {
|
for id in removed_channels {
|
||||||
self.remove_subscription(&id);
|
self.remove_subscription(&id).await;
|
||||||
self.cache.channels.remove(&id);
|
self.cache.channels.remove(&id);
|
||||||
|
|
||||||
bulk_events.push(EventV1::ChannelDelete { id });
|
bulk_events.push(EventV1::ChannelDelete { id });
|
||||||
@@ -263,7 +263,7 @@ impl State {
|
|||||||
.channels
|
.channels
|
||||||
.insert(channel.id().to_string(), channel.clone());
|
.insert(channel.id().to_string(), channel.clone());
|
||||||
|
|
||||||
self.insert_subscription(channel.id().to_string());
|
self.insert_subscription(channel.id().to_string()).await;
|
||||||
bulk_events.push(EventV1::ChannelCreate(channel.into()));
|
bulk_events.push(EventV1::ChannelCreate(channel.into()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -336,7 +336,7 @@ impl State {
|
|||||||
match event {
|
match event {
|
||||||
EventV1::ChannelCreate(channel) => {
|
EventV1::ChannelCreate(channel) => {
|
||||||
let id = channel.id().to_string();
|
let id = channel.id().to_string();
|
||||||
self.insert_subscription(id.clone());
|
self.insert_subscription(id.clone()).await;
|
||||||
self.cache.channels.insert(id, channel.clone().into());
|
self.cache.channels.insert(id, channel.clone().into());
|
||||||
}
|
}
|
||||||
EventV1::ChannelUpdate {
|
EventV1::ChannelUpdate {
|
||||||
@@ -376,17 +376,17 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
EventV1::ChannelDelete { id } => {
|
EventV1::ChannelDelete { id } => {
|
||||||
self.remove_subscription(id);
|
self.remove_subscription(id).await;
|
||||||
self.cache.channels.remove(id);
|
self.cache.channels.remove(id);
|
||||||
}
|
}
|
||||||
EventV1::ChannelGroupJoin { user, .. } => {
|
EventV1::ChannelGroupJoin { user, .. } => {
|
||||||
self.insert_subscription(user.clone());
|
self.insert_subscription(user.clone()).await;
|
||||||
}
|
}
|
||||||
EventV1::ChannelGroupLeave { id, user, .. } => {
|
EventV1::ChannelGroupLeave { id, user, .. } => {
|
||||||
if user == &self.cache.user_id {
|
if user == &self.cache.user_id {
|
||||||
self.remove_subscription(id);
|
self.remove_subscription(id).await;
|
||||||
} else if !self.cache.can_subscribe_to_user(user) {
|
} else if !self.cache.can_subscribe_to_user(user) {
|
||||||
self.remove_subscription(user);
|
self.remove_subscription(user).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,7 +396,7 @@ impl State {
|
|||||||
channels,
|
channels,
|
||||||
emojis: _,
|
emojis: _,
|
||||||
} => {
|
} => {
|
||||||
self.insert_subscription(id.clone());
|
self.insert_subscription(id.clone()).await;
|
||||||
self.cache.servers.insert(id.clone(), server.clone().into());
|
self.cache.servers.insert(id.clone(), server.clone().into());
|
||||||
let member = Member {
|
let member = Member {
|
||||||
id: MemberCompositeKey {
|
id: MemberCompositeKey {
|
||||||
@@ -435,11 +435,11 @@ impl State {
|
|||||||
}
|
}
|
||||||
EventV1::ServerMemberLeave { id, user } => {
|
EventV1::ServerMemberLeave { id, user } => {
|
||||||
if user == &self.cache.user_id {
|
if user == &self.cache.user_id {
|
||||||
self.remove_subscription(id);
|
self.remove_subscription(id).await;
|
||||||
|
|
||||||
if let Some(server) = self.cache.servers.remove(id) {
|
if let Some(server) = self.cache.servers.remove(id) {
|
||||||
for channel in &server.channels {
|
for channel in &server.channels {
|
||||||
self.remove_subscription(channel);
|
self.remove_subscription(channel).await;
|
||||||
self.cache.channels.remove(channel);
|
self.cache.channels.remove(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -447,11 +447,11 @@ impl State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
EventV1::ServerDelete { id } => {
|
EventV1::ServerDelete { id } => {
|
||||||
self.remove_subscription(id);
|
self.remove_subscription(id).await;
|
||||||
|
|
||||||
if let Some(server) = self.cache.servers.remove(id) {
|
if let Some(server) = self.cache.servers.remove(id) {
|
||||||
for channel in &server.channels {
|
for channel in &server.channels {
|
||||||
self.remove_subscription(channel);
|
self.remove_subscription(channel).await;
|
||||||
self.cache.channels.remove(channel);
|
self.cache.channels.remove(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -524,9 +524,9 @@ impl State {
|
|||||||
self.cache.users.insert(id.clone(), user.clone().into());
|
self.cache.users.insert(id.clone(), user.clone().into());
|
||||||
|
|
||||||
if self.cache.can_subscribe_to_user(id) {
|
if self.cache.can_subscribe_to_user(id) {
|
||||||
self.insert_subscription(id.clone());
|
self.insert_subscription(id.clone()).await;
|
||||||
} else {
|
} else {
|
||||||
self.remove_subscription(id);
|
self.remove_subscription(id).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -540,11 +540,11 @@ impl State {
|
|||||||
|
|
||||||
// Sub / unsub accordingly.
|
// Sub / unsub accordingly.
|
||||||
if let Some(id) = queue_add {
|
if let Some(id) = queue_add {
|
||||||
self.insert_subscription(id);
|
self.insert_subscription(id).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(id) = queue_remove {
|
if let Some(id) = queue_remove {
|
||||||
self.remove_subscription(&id);
|
self.remove_subscription(&id).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ async fn worker(
|
|||||||
match payload {
|
match payload {
|
||||||
ClientMessage::BeginTyping { channel } => {
|
ClientMessage::BeginTyping { channel } => {
|
||||||
if !subscribed.read().await.contains(&channel) {
|
if !subscribed.read().await.contains(&channel) {
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventV1::ChannelStartTyping {
|
EventV1::ChannelStartTyping {
|
||||||
@@ -303,7 +303,7 @@ async fn worker(
|
|||||||
}
|
}
|
||||||
ClientMessage::EndTyping { channel } => {
|
ClientMessage::EndTyping { channel } => {
|
||||||
if !subscribed.read().await.contains(&channel) {
|
if !subscribed.read().await.contains(&channel) {
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventV1::ChannelStopTyping {
|
EventV1::ChannelStopTyping {
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use revolt_result::Result;
|
use revolt_result::Result;
|
||||||
#[cfg(feature = "rocket-impl")]
|
#[cfg(feature = "rocket-impl")]
|
||||||
use rocket::request::FromParam;
|
use rocket::request::FromParam;
|
||||||
@@ -44,9 +46,27 @@ impl Reference {
|
|||||||
db.fetch_channel(&self.id).await
|
db.fetch_channel(&self.id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fetch invite from Ref
|
/// Fetch invite from Ref or create invite to server if discoverable
|
||||||
pub async fn as_invite(&self, db: &Database) -> Result<Invite> {
|
pub async fn as_invite(&self, db: &Database) -> Result<Invite> {
|
||||||
db.fetch_invite(&self.id).await
|
if ulid::Ulid::from_str(&self.id).is_ok() {
|
||||||
|
let server = self.as_server(db).await?;
|
||||||
|
if !server.discoverable {
|
||||||
|
return Err(create_error!(NotFound));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Invite::Server {
|
||||||
|
code: self.id.to_string(),
|
||||||
|
server: server.id,
|
||||||
|
creator: server.owner,
|
||||||
|
channel: server
|
||||||
|
.channels
|
||||||
|
.into_iter()
|
||||||
|
.next()
|
||||||
|
.ok_or(create_error!(NotFound))?,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
db.fetch_invite(&self.id).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fetch message from Ref
|
/// Fetch message from Ref
|
||||||
|
|||||||
Reference in new issue
Block a user