Compare commits

..

85 Commits

Author SHA1 Message Date
withchao
24a0479761 merge 2024-01-26 15:21:28 +08:00
withchao
b2ca1366f8 Merge branch 'main' into localcache
# Conflicts:
#	go.mod
#	go.sum
#	internal/push/push_to_client.go
2024-01-26 15:21:06 +08:00
withchao
1a14191d66 Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	go.sum
2024-01-26 15:18:19 +08:00
Gordon
9d313cb308 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-23 16:18:27 +08:00
Gordon
38e11dc678 fix: refactor project dir avoid import cycle. 2024-01-23 16:18:00 +08:00
withchao
b940bcaafe merge 2024-01-23 16:03:22 +08:00
withchao
efa74a95a7 Merge branch 'main' into localcache
# Conflicts:
#	go.mod
#	go.sum
#	internal/push/push_rpc_server.go
#	internal/push/push_to_client.go
2024-01-23 16:02:53 +08:00
Gordon
119a2c2247 refactor: rename cache. 2024-01-22 21:14:21 +08:00
withchao
4266fed44f cicd: robot automated Change 2024-01-22 03:13:27 +00:00
chao
c81e199698 Merge branch 'openimsdk:main' into main 2024-01-22 11:11:32 +08:00
Gordon
9660556f35 refactor: refactor the code of push and optimization. 2024-01-21 20:47:07 +08:00
Gordon
c7067bc48a Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-21 20:41:28 +08:00
withchao
84f97a72f4 update tools 2024-01-23 22:07:29 +00:00
Gordon
5a81a7a560 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-19 09:49:01 +08:00
withchao
0ee68e57b9 feat: msg rpc local cache 2024-01-18 15:42:57 +08:00
withchao
59529718bb Merge remote-tracking branch 'origin/main' into localcache
# Conflicts:
#	go.mod
#	tools/component/component.go
2024-01-18 15:34:55 +08:00
chao
e3d78de887 Merge branch 'openimsdk:main' into main 2024-01-18 15:30:48 +08:00
withchao
e3ff304394 feat: msg rpc local cache 2024-01-18 15:09:27 +08:00
withchao
899f1f15a4 feat: msg rpc local cache 2024-01-18 15:06:07 +08:00
Gordon
33094ec532 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-18 13:19:51 +08:00
withchao
e26a582836 feat: msg rpc local cache 2024-01-17 17:33:54 +08:00
withchao
77894b104e feat: msg rpc local cache 2024-01-17 17:26:46 +08:00
withchao
c16f17582a feat: msg rpc local cache 2024-01-17 16:37:26 +08:00
Gordon
445db67568 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-16 18:16:46 +08:00
Gordon
30ef247a59 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-16 17:52:42 +08:00
withchao
025eb44113 feat: local cache 2024-01-16 17:52:33 +08:00
withchao
af5e191144 feat: local cache 2024-01-16 17:46:28 +08:00
withchao
4a042489bf feat: local cache 2024-01-16 17:19:29 +08:00
withchao
9e4a7d082d feat: local cache 2024-01-16 17:01:38 +08:00
Gordon
000f6ce595 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-16 16:49:34 +08:00
withchao
f53dd855aa feat: local cache 2024-01-16 16:42:47 +08:00
withchao
f1506e40c4 feat: local cache 2024-01-16 15:53:00 +08:00
Gordon
b9eb642616 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-16 15:22:01 +08:00
withchao
1c93f87e95 feat: local cache 2024-01-16 15:13:49 +08:00
Gordon
b2eae0999c Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-16 11:21:29 +08:00
withchao
1afdd0bcf7 feat: local cache 2024-01-16 11:15:28 +08:00
chao
45859d9cab Merge branch 'openimsdk:main' into main 2024-01-16 10:58:43 +08:00
withchao
d26a1b2090 feat: local cache 2024-01-16 10:20:57 +08:00
Gordon
1e81d29e86 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-15 19:46:37 +08:00
withchao
6e1f96a720 feat: local cache 2024-01-15 17:08:02 +08:00
withchao
656bfef069 feat: local cache 2024-01-15 16:48:21 +08:00
withchao
1db6e3b389 feat: local cache 2024-01-15 16:33:25 +08:00
withchao
32221da613 feat: local cache 2024-01-15 16:27:02 +08:00
withchao
ad5e4e1540 feat: local cache 2024-01-15 16:02:34 +08:00
withchao
c9193302a8 feat: local cache 2024-01-15 15:53:40 +08:00
Gordon
640c363eee Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-15 15:50:40 +08:00
withchao
abbb701192 feat: local cache 2024-01-15 15:23:42 +08:00
Gordon
b87e366d74 Merge remote-tracking branch 'origin/localcache' into localcache 2024-01-15 12:09:47 +08:00
withchao
3e30e50a09 feat: local cache 2024-01-15 11:42:18 +08:00
Gordon
41d2c7be7a Merge remote-tracking branch 'origin/localcache' into localcache
# Conflicts:
#	pkg/common/localcache/cache.go
2024-01-15 10:55:05 +08:00
Gordon
166d51ab23 feat: cache add single-flight and timing-wheel. 2024-01-15 10:54:15 +08:00
withchao
749eb11830 feat: local cache 2024-01-12 18:23:15 +08:00
withchao
a81bc3fc23 feat: local cache 2024-01-12 17:51:01 +08:00
withchao
9908e2c658 Merge remote-tracking branch 'origin/localcache' into localcache
# Conflicts:
#	pkg/common/localcache/cache.go
#	pkg/common/localcache/option.go
2024-01-12 16:11:26 +08:00
withchao
45064ae5ca feat: local cache 2024-01-12 15:41:05 +08:00
Gordon
1f1ab65375 feat: cache add single-flight and timing-wheel. 2024-01-12 13:27:54 +08:00
withchao
48ff03f854 fix: NotificationUserInfoUpdate 2024-01-12 11:01:28 +08:00
withchao
a00d77a705 fix: GroupApplicationAcceptedNotification 2024-01-11 16:33:50 +08:00
chao
ad979d493d Merge branch 'openimsdk:main' into main 2024-01-11 14:32:46 +08:00
withchao
f5f2cf4746 Merge remote-tracking branch 'origin/main' 2024-01-11 11:20:20 +08:00
withchao
4c3c4555a3 fix: GroupApplicationAcceptedNotification 2024-01-11 11:18:52 +08:00
withchao
006e4a1e93 local cache 2024-01-10 16:24:46 +08:00
withchao
8ff8861603 local cache 2024-01-10 16:13:55 +08:00
withchao
2d21ab3aeb local cache 2024-01-10 16:03:49 +08:00
withchao
a84ad774f7 local cache 2024-01-10 15:27:24 +08:00
withchao
ee9c9eb97c localcache 2024-01-10 15:16:30 +08:00
withchao
da2c0d11f5 localcache 2024-01-10 15:06:12 +08:00
withchao
7a67beb7a1 localcache 2024-01-10 14:38:04 +08:00
withchao
28292be37d localcache 2024-01-10 12:09:25 +08:00
withchao
1ea5fe04f1 localcache 2024-01-10 12:08:15 +08:00
withchao
c16cd0bf7c localcache 2024-01-10 12:01:55 +08:00
withchao
03e15766ab localcache 2024-01-10 11:57:46 +08:00
withchao
f0e5c587ad localcache 2024-01-10 11:46:27 +08:00
withchao
b0ec48d35d localcache 2024-01-10 11:41:57 +08:00
withchao
8360c72300 openim.yaml 2024-01-10 11:12:52 +08:00
withchao
18ad656087 Merge remote-tracking branch 'origin/main' into localcache 2024-01-10 11:05:34 +08:00
withchao
22c00c411e fix: mongo 2024-01-10 10:32:18 +08:00
withchao
f0075265d5 fix: mongo 2024-01-10 10:18:05 +08:00
withchao
86aebfc0bd fix: mongo 2024-01-09 17:36:24 +08:00
withchao
bbb5ef5ccc feat: msg local cache 2024-01-09 17:01:50 +08:00
withchao
0248fbb47d feat: msg local cache 2024-01-08 20:38:23 +08:00
withchao
938622b1fe feat: msg local cache 2024-01-08 20:36:41 +08:00
withchao
3d77c1c8cf feat: msg local cache 2024-01-08 16:47:39 +08:00
withchao
1ae523dcc2 feat: msg local cache 2024-01-08 15:41:57 +08:00
withchao
d9921248a7 feat: msg local cache 2024-01-08 15:39:39 +08:00
119 changed files with 2736 additions and 3162 deletions

View File

@@ -1,27 +0,0 @@
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
# Existing steps...
- name: Check CLA status
uses: contributor-assistant/github-action@v2.3.1
with:
cla-file: 'CLA.md'
fail-on-cla-failure: true
# Existing steps...

View File

@@ -14,6 +14,12 @@
name: Github Pull Request
on:
push:
branches: [main]
paths-ignore:
- 'README.md'
- 'CONTRIBUTING.md'
- 'docs/**'
workflow_dispatch:
schedule:
- cron: '0 2 * * *'
@@ -31,18 +37,24 @@ jobs:
with:
fetch-depth: 0
- name: Get League branch Patch
run: |
git config user.name 'openimbot'
git config user.email 'openimsdk@qq.com'
BRANCH_NAME="auto-pr-$(date +'%Y%m%d%H%M%S')"
git checkout -b $BRANCH_NAME
- uses: actions/setup-node@v4
- name: Setup Go
uses: actions/setup-go@v4
- name: Run go modules tidy
run: |
sudo apt-get install jq
sudo make tidy
sudo make tools.verify.go-gitlint
echo "Run go modules tidy successfully"
continue-on-error: true
- name: Run go format and lint
- name: Run go format
run: |
sudo make format
echo "Run go format successfully"
@@ -57,21 +69,7 @@ jobs:
- name: Generate all necessary files, such as error code files
run: |
make generate
echo "Generate all necessary files successfully"
continue-on-error: true
- name: make init
run: |
export OPENIM_IP=127.0.0.1
export LOG_STORAGE_LOCATION="../logs/"
./scripts/init-config.sh --examples --force
echo "Generate all necessary files successfully"
continue-on-error: true
- name: Generate Vertions
run: |
latest_tag=$(git describe --tags `git rev-list --tags --max-count=1` | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
echo $latest_tag > pkg/common/config/version
echo "Generate all necessary files successfully"
continue-on-error: true
- name: Run unit test and get test coverage
@@ -82,6 +80,7 @@ jobs:
- name: OpenIM verify copyright
run: |
sudo make verify-copyright
sudo make add-copyright
echo "OpenIM verify successfully"
continue-on-error: true
@@ -91,28 +90,23 @@ jobs:
with:
token: ${{ secrets.BOT_GITHUB_TOKEN }}
commit-message: "cicd: bump League Patch"
author: kubbot <3293172751ysy@gmail.com>
committer: kubbot <3293172751ysy@gmail.com>
# signoff: false
# draft: false
branch: "asf-auto-updates"
author: kubbot <kubbot@3293172751ysy@gmail.com>
signoff: false
draft: false
branch: ''
assignees: cubxxw
reviewers: cubxxw
title: "[Auto PR 🤖] Bump League Patch auto PR"
delete-branch: true
title: "Bump League Patch auto PR: $(date +'%Y%m%d')"
body: |
I am a PR generated by robot automation.
Review criteria:
- [ ] Disenchanter can connect and issue actions
Github Actions Status:
[![Github Pull Request](https://github.com/openimsdk/open-im-server/actions/workflows/pull-request.yml/badge.svg)](https://github.com/openimsdk/open-im-server/actions/workflows/pull-request.yml)
This is an automated PR.
This is an automated PR. @ $(date +'%Y%m%d')
<sub>[workflow](https://github.com/openimsdk/open-im-server/blob/main/.github/workflows/pull-request.yml).</sub>
base: main
labels: |
kind/documentation
enhancement
report
report

View File

@@ -243,10 +243,9 @@ push:
#
# Built-in app manager user IDs
# Built-in app manager nicknames
# Attention, this configure is discarded. If you have used him before, configure your own
manager:
userID:
nickname:
userID: [ "${MANAGER_USERID_1}", "${MANAGER_USERID_2}", "${MANAGER_USERID_3}" ]
nickname: [ "${NICKNAME_1}", "${NICKNAME_2}", "${NICKNAME_3}" ]
# chatAdmin, use for send notification
#
@@ -330,7 +329,7 @@ callback:
timeout: ${CALLBACK_TIMEOUT}
failedContinue: ${CALLBACK_FAILED_CONTINUE}
afterSendSingleMsg:
enable: ${CALLBACK_ENABLE}
enable: true
timeout: ${CALLBACK_TIMEOUT}
failedContinue: ${CALLBACK_FAILED_CONTINUE}
beforeSendGroupMsg:
@@ -528,3 +527,39 @@ prometheus:
rtcPrometheusPort: [ ${RTC_PROM_PORT} ]
thirdPrometheusPort: [ ${THIRD_PROM_PORT} ]
messageTransferPrometheusPort: [ ${MSG_TRANSFER_PROM_PORT} ] # List of ports
###################### LocalCache configuration information ######################
# topic: redis subscriber channel
# slotNum: number of slots, multiple slots can prevent too many keys from competing for a lock
# slotSize: number of slots, the number of cached keys per slot, the overall cache quantity is slotNum * slotSize
# successExpire: successful cache time seconds
# failedExpire: failed cache time seconds
# disable local caching and annotate topic, slotNum, and slotSize
localCache:
user:
topic: DELETE_CACHE_USER
slotNum: 100
slotSize: 2000
successExpire: 300
failedExpire: 5
group:
topic: DELETE_CACHE_GROUP
slotNum: 100
slotSize: 2000
successExpire: 300
failedExpire: 5
friend:
topic: DELETE_CACHE_FRIEND
slotNum: 100
slotSize: 2000
successExpire: 300
failedExpire: 5
conversation:
topic: DELETE_CACHE_CONVERSATION
slotNum: 100
slotSize: 2000
successExpire: 300
failedExpire: 5

View File

@@ -100,7 +100,7 @@ ZOOKEEPER_PORT=${ZOOKEEPER_PORT}
# MongoDB service port configuration.
# Default: MONGO_PORT=37017
MONGO_PORT=${MONGO_PORT}
# MONGO_PORT=${MONGO_PORT}
# Password for MongoDB admin user. Used for service authentication.
# Default: MONGO_PASSWORD=openIM123

View File

@@ -1,67 +0,0 @@
# وثائق OpenIM Server
مرحبًا بكم في مركز وثائق OpenIM! يوفر هذا المركز مجموعة شاملة من الأدلة والكتيبات التي صُممت لمساعدتك في الاستفادة القصوى من تجربة OpenIM الخاصة بك.
## جدول المحتويات
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - إرشادات حول المساهمة والتكوينات للمطورين
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - اتفاقيات الكود، سياسات التسجيل، وأدوات التحويل الأخرى
------
## مساهمة
هذا القسم يقدم للمطورين دليلاً مفصلاً حول كيفية المساهمة في الكود، إعداد بيئتهم، واتباع العمليات المرتبطة.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - قواعد واتفاقيات لكتابة الكود في OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - دليل حول كيفية القيام بالتطوير داخل OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - إرشادات حول عمليات اختيار الجيت.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - سير عمل الجيت في OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - إرشادات حول إعداد وتهيئة OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - كيفية تثبيت الدوكر على جهازك.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - دليل لإعداد بيئة التطوير على لينكس.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - إرشادات حول كيفية القيام ببعض الأعمال الشائعة محليًا.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - طرق توظيف OpenIM دون اتصال.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - دليل حول استخدام أدوات بروتوك.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - أدوات ومكتبات في OpenIM للغة Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - أفضل الممارسات والأدوات لملفات الصيانة.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - أفضل الممارسات والأدوات للسكربتات.
## التحويلات
يقدم هذا القسم مختلف الاتفاقيات والسياسات داخل OpenIM، التي تشمل الكود، السجلات، الإصدارات، والمزيد.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - إرشادات وطرق لتحويلات API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - سياسات واتفاقيات التسجيل في OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - إجراءات واتفاقيات لـ CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - اتفاقيات لالتزامات الكود في OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - هيكل الدليل واتفاقياته داخل OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - قائمة وأوصاف رموز الخطأ.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - اتفاقيات وتحويلات لكود Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - استراتيجيات إدارة صور الدوكر في OpenIM، تشمل عدة معماريات ومستودعات الصور.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - اتفاقيات أكثر تفصيلاً حول التسجيل.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - استراتيجيات التسمية والإدارة لإصدارات OpenIM.
## للمطورين والمساهمين ومشرفي المجتمع
### المطورون والمساهمون
إذا كنت مطورًا أو شخصًا حريصًا على المساهمة:
- تعرف على [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) و[Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) لضمان سلاسة المساهمات.
- اغمر نفسك في [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) للتعرف على ممارسات التطوير في OpenIM.
### مشرفو المجتمع
كمشرف على المجتمع:
- تأكد من أن المساهمات تتوافق مع المعايير الموضحة في وثائقنا.
- راجع بانتظام [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) و[Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) للبقاء على اطلاع.
## للمستخدمين
يجب أن يولي المستخدمون اهتمامًا خاصًا لـ:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - ضروري إذا كنت تخطط لاستخدام صور الدوكر لـ OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - لفهم الصور المختلفة المتاحة وكيفية اختيار ال

View File

@@ -1,67 +0,0 @@
# Dokumenty serveru OpenIM
Vítejte v centru dokumentace OpenIM! Toto centrum poskytuje komplexní řadu průvodců a manuálů navržených tak, aby vám pomohly co nejlépe využít vaše zkušenosti s OpenIM.
## Obsah
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Pokyny pro přispívání a konfigurace pro vývojáře
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Konvence kódování, zásady protokolování a další transformační nástroje
------
## Contrib
Tato část nabízí vývojářům podrobný návod, jak přispívat kódem, nastavovat prostředí a sledovat související procesy.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Pravidla a konvence pro psaní kódu v OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Návod, jak provádět vývoj v rámci OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Pokyny pro operace sběru třešní.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Pracovní postup git v OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Pokyny k nastavení a inicializaci OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Jak nainstalovat Docker na váš počítač.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Průvodce nastavením vývojového prostředí na Linuxu.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Pokyny k provádění určitých společných akcí na místní úrovni.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Metody nasazení OpenIM offline.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Průvodce používáním protokolových nástrojů.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Nástroje a knihovny v OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Osvědčené postupy a nástroje pro Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Doporučené postupy a nástroje pro skripty.
## Konverze
Tato část představuje různé konvence a zásady v rámci OpenIM, zahrnující kód, protokoly, verze a další.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Pokyny a metody pro konverze API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Zásady a konvence protokolování v OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Postupy a konvence pro CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Konvence pro odevzdání kódu v OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Struktura adresářů a konvence v rámci OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Seznam a popisy chybových kódů.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konvence a převody pro kód Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Strategie správy pro obrazy OpenIM Docker, zahrnující různé architektury a úložiště obrazů.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Další podrobné konvence o protokolování.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Strategie pojmenování a správy verzí OpenIM.
## Pro vývojáře, přispěvatele a správce komunity
### Vývojáři a přispěvatelé
Pokud jste vývojář nebo někdo, kdo má zájem přispívat:
- Seznamte se s našimi [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) a [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md), abyste zajistili hladké příspěvky.
- Ponořte se do [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md), abyste se seznámili s vývojovými postupy v OpenIM.
### Správci komunity
Jako správce komunity:
- Zajistěte, aby příspěvky odpovídaly standardům uvedeným v naší dokumentaci.
- Pravidelně kontrolujte [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) a [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) , abyste zůstali aktuální.
## Pro uživatele
Uživatelé by měli věnovat zvláštní pozornost:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Nezbytné, pokud plánujete používat obrazy OpenIM Docker.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Chcete-li porozumět různým dostupným obrázkům a jak vybrat ten správný pro vaši architekturu.

View File

@@ -1,67 +0,0 @@
# OpenIM Server Dokumentation
Velkommen til OpenIM Dokumentationscentret! Dette center indeholder en omfattende række vejledninger og manualer, der er designet til at hjælpe dig med at få mest muligt ud af din OpenIM-oplevelse.
## Indholdsfortegnelse
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Vejledning om bidrag og konfigurationer for udviklere
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Kodningskonventioner, logningspolitikker og andre transformationsværktøjer
------
## Bidrag
Denne sektion tilbyder udviklere en detaljeret vejledning om, hvordan de kan bidrage med kode, konfigurere deres miljø og følge de tilknyttede processer.
- [Kodekonventioner](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Regler og konventioner for at skrive kode i OpenIM.
- [Udviklingsguide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - En guide om, hvordan man udfører udvikling inden for OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Retningslinjer for cherry-picking-operationer.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Git-workflowen i OpenIM.
- [Initialiseringskonfigurationer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Vejledning om opsætning og initialisering af OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Sådan installeres Docker på din maskine.
- [Linux Udviklingsmiljø](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Guide til opsætning af udviklingsmiljøet på Linux.
- [Lokale handlinger](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Retningslinjer for, hvordan man udfører visse almindelige handlinger lokalt.
- [Offline-deploering](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Metoder til at udrulle OpenIM offline.
- [Protoc-værktøjer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Guide til brug af protoc-værktøjer.
- [Go-værktøjer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Værktøjer og biblioteker i OpenIM til Go.
- [Makefile-værktøjer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Bedste praksis og værktøjer til Makefile.
- [Scriptværktøjer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Bedste praksis og værktøjer til scripts.
## Konverteringer
Denne sektion introducerer forskellige konventioner og politikker inden for OpenIM, herunder kode, logfiler, versioner og meget mere.
- [API-konverteringer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Retningslinjer og metoder til API-konverteringer.
- [Logningspolitik](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Politikker og konventioner for logning i OpenIM.
- [CI/CD-handlinger](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Procedurer og konventioner for CI/CD.
- [Commit-konventioner](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Konventioner for kodeforpligtelser i OpenIM.
- [Mappekonventioner](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Mappens struktur og konventioner inden for OpenIM.
- [Fejlkoder](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Liste og beskrivelser af fejlkoder.
- [Go-kodekonverteringer](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konventioner og konverteringer for Go-kode.
- [Docker Image-strategi](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Styringsstrategier for OpenIM Docker-billeder, der dækker flere arkitekturer og billedarkiver.
- [Logningskonventioner](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Yderligere detaljerede konventioner om logning.
- [Versionkonventioner](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Navngivnings- og styringsstrategier for OpenIM-versioner.
## For udviklere, bidragsydere og samfundsvedligeholdere
### Udviklere og bidragsydere
Hvis du er en udvikler eller nogen, der gerne vil bidrage:
- Gør dig fortrolig med vores [Kodekonventioner](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) og [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) for at sikre en problemfri bidragelse.
- Dyk ned i [Udviklingsguiden](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) for at få en idé om udviklingspraksis i OpenIM.
### Samfundsvedligeholdere
Som samfundsvedligeholder:
- Sørg for, at bidrag stemmer overens med standarderne beskrevet i vores dokumentation.
- Gennemgå regelmæssigt [Logningspolitikken](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) og [Fejlkoderne](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) for at holde dig opdateret.
## For brugere
Brugere bør være opmærksomme på følgende:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Nødvendigt, hvis du planlægger at bruge Docker-billeder af OpenIM.
- [Docker Image-strategi](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - For at forstå de forskellige tilgængelige billeder og hvordan man vælger det rigtige for din arkitektur.

View File

@@ -1,66 +0,0 @@
# OpenIM-Serverdokumente
Willkommen im OpenIM-Dokumentationshub! Dieses Zentrum bietet eine umfassende Auswahl an Leitfäden und Handbüchern, die Ihnen dabei helfen sollen, das Beste aus Ihrem OpenIM-Erlebnis herauszuholen.
## Inhaltsverzeichnis
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Anleitung zu Beiträgen und Konfigurationen für Entwickler
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Codierungskonventionen, Protokollierungsrichtlinien und andere Transformationstools
------
## Beitrag
Dieser Abschnitt bietet Entwicklern eine detaillierte Anleitung zum Beitragen von Code, zum Einrichten ihrer Umgebung und zum Befolgen der zugehörigen Prozesse.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Regeln und Konventionen zum Schreiben von Code in OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Eine Anleitung zur Durchführung der Entwicklung innerhalb von OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Richtlinien zur Rosinenpickerei.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Der Git-Workflow in OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Anleitung zum Einrichten und Initialisieren von OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - So installieren Sie Docker auf Ihrem Computer.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Anleitung zum Einrichten der Entwicklungsumgebung unter Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Richtlinien zur Durchführung bestimmter allgemeiner Aktionen vor Ort.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Methoden zur Offline-Bereitstellung von OpenIM.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Anleitung zur Verwendung von Protokolltools.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Tools und Bibliotheken in OpenIM für Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Best Practices und Tools für Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Best Practices und Tools für Skripte.
## Konvertierungen
In diesem Abschnitt werden verschiedene Konventionen und Richtlinien innerhalb von OpenIM vorgestellt, die Code, Protokolle, Versionen und mehr umfassen.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Richtlinien und Methoden für API-Konvertierungen.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Protokollierungsrichtlinien und -konventionen in OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Verfahren und Konventionen für CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Konventionen für Code-Commits in OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Verzeichnisstruktur und Konventionen innerhalb von OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Liste und Beschreibungen der Fehlercodes.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konventionen und Konvertierungen für Go-Code.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Verwaltungsstrategien für OpenIM-Docker-Images, die mehrere Architekturen und Image-Repositorys umfassen.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Weitere detaillierte Konventionen zur Protokollierung.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Benennungs- und Verwaltungsstrategien für OpenIM-Versionen.
## Für Entwickler, Mitwirkende und Community-Betreuer
### Entwickler und Mitwirkende
Wenn Sie Entwickler sind oder gerne einen Beitrag leisten möchten:
- Machen Sie sich mit unseren [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) und unserem [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) vertraut, um reibungslose Beiträge zu gewährleisten.
- Tauchen Sie ein in den [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md), um sich mit den Entwicklungspraktiken in OpenIM vertraut zu machen.
### Community-Betreuer
Als Community-Betreuer:
- Stellen Sie sicher, dass die Beiträge den in unserer Dokumentation dargelegten Standards entsprechen.
- Überprüfen Sie regelmäßig die [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) und die [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md), um auf dem Laufenden zu bleiben.
## Für Benutzer
Benutzer sollten besonders auf Folgendes achten:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Erforderlich, wenn Sie Docker-Images von OpenIM verwenden möchten.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Um die verschiedenen verfügbaren Bilder zu verstehen und wie Sie das richtige für Ihre Architektur auswählen.

View File

@@ -1,67 +0,0 @@
# Έγγραφα διακομιστή OpenIM
Καλώς ήρθατε στο κέντρο τεκμηρίωσης OpenIM! Αυτό το κέντρο παρέχει μια ολοκληρωμένη σειρά οδηγών και εγχειριδίων που έχουν σχεδιαστεί για να σας βοηθήσουν να αξιοποιήσετε στο έπακρο την εμπειρία σας στο OpenIM.
## Πίνακας περιεχομένων
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Οδηγίες για τη συνεισφορά και τις διαμορφώσεις για προγραμματιστές
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Συμβάσεις κωδικοποίησης, πολιτικές καταγραφής και άλλα εργαλεία μετασχηματισμού
------
## Συνεισφορά
Αυτή η ενότητα προσφέρει στους προγραμματιστές έναν λεπτομερή οδηγό για το πώς να συνεισφέρουν κώδικα, να ρυθμίσουν το περιβάλλον τους και να ακολουθήσουν τις σχετικές διαδικασίες.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Κανόνες και συμβάσεις για τη σύνταξη κώδικα στο OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Ένας οδηγός για το πώς να πραγματοποιήσετε ανάπτυξη στο OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Οδηγίες για τις εργασίες συλλογής κερασιών.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Η ροή εργασίας git στο OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Οδηγίες για τη ρύθμιση και την προετοιμασία του OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Πώς να εγκαταστήσετε το Docker στο μηχάνημά σας.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Οδηγός για τη ρύθμιση του περιβάλλοντος ανάπτυξης στο Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Οδηγίες για τον τρόπο εκτέλεσης ορισμένων κοινών ενεργειών σε τοπικό επίπεδο.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Μέθοδοι ανάπτυξης OpenIM εκτός σύνδεσης.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Οδηγός χρήσης εργαλείων πρωτοκόλλου.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Εργαλεία και βιβλιοθήκες στο OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Βέλτιστες πρακτικές και εργαλεία για το Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Βέλτιστες πρακτικές και εργαλεία για σενάρια.
## Μετατροπές
Αυτή η ενότητα εισάγει διάφορες συμβάσεις και πολιτικές στο OpenIM, που περιλαμβάνουν κώδικα, αρχεία καταγραφής, εκδόσεις και άλλα.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Οδηγίες και μέθοδοι για μετατροπές API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Πολιτικές και συμβάσεις καταγραφής στο OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Διαδικασίες και συμβάσεις για CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Συμβάσεις για δεσμεύσεις κώδικα στο OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Δομή καταλόγου και συμβάσεις στο OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Λίστα και περιγραφές κωδικών σφαλμάτων.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Συμβάσεις και μετατροπές για τον κώδικα Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Στρατηγικές διαχείρισης για εικόνες OpenIM Docker, που εκτείνονται σε πολλαπλές αρχιτεκτονικές και αποθετήρια εικόνων.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Περαιτέρω λεπτομερείς συμβάσεις για την υλοτομία.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Στρατηγικές ονομασίας και διαχείρισης για εκδόσεις OpenIM.
## Για προγραμματιστές, συνεισφέροντες και συντηρητές κοινότητας
### Προγραμματιστές & Συνεισφέροντες
Εάν είστε προγραμματιστής ή κάποιος που επιθυμεί να συνεισφέρει:
- Εξοικειωθείτε με τις [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) και [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) για να εξασφαλίσετε ομαλή συνεισφορά.
- Βουτήξτε στον [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) για να δείτε τις πρακτικές ανάπτυξης στο OpenIM.
### Συντηρητές της Κοινότητας
Ως συντηρητής κοινότητας:
- Βεβαιωθείτε ότι οι συνεισφορές ευθυγραμμίζονται με τα πρότυπα που περιγράφονται στην τεκμηρίωσή μας.
- Να ελέγχετε τακτικά την [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) και τους [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) για να ενημερώνεστε.
## Για Χρήστες
Οι χρήστες θα πρέπει να δώσουν ιδιαίτερη προσοχή:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Απαραίτητο εάν σκοπεύετε να χρησιμοποιήσετε εικόνες Docker του OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Για να κατανοήσετε τις διάφορες διαθέσιμες εικόνες και πώς να επιλέξετε τη σωστή για την αρχιτεκτονική σας.

View File

@@ -1,67 +0,0 @@
# OpenIM Server Docs
Bonvenon al la OpenIM Dokumenta nabo! Ĉi tiu centro disponigas ampleksan gamon da gvidiloj kaj manlibroj desegnitaj por helpi vin eltiri la plej grandan parton de via OpenIM-sperto.
## Enhavtabelo
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Gvidilo pri kontribuado kaj agordoj por programistoj
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Kodigaj konvencioj, registradaj politikoj kaj aliaj transformaj iloj
------
## Kontribui
Ĉi tiu sekcio ofertas al programistoj detalan gvidilon pri kiel kontribui kodon, agordi sian medion kaj sekvi la rilatajn procezojn.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Reguloj kaj konvencioj por skribi kodon en OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Gvidilo pri kiel efektivigi disvolviĝon ene de OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Gvidlinioj pri ĉeriz-plukaj operacioj.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - La git-laborfluo en OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Gvidilo pri agordo kaj pravalorigo de OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Kiel instali Docker sur via maŝino.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Gvidilo por agordi la evolumedion en Linukso.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Gvidlinioj pri kiel efektivigi certajn komunajn agojn loke.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Metodoj por disfaldi OpenIM eksterrete.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Gvidilo pri uzado de protokaj iloj.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Iloj kaj bibliotekoj en OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Plej bonaj praktikoj kaj iloj por Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Plej bonaj praktikoj kaj iloj por skriptoj.
## Konvertiĝoj
Ĉi tiu sekcio enkondukas diversajn konvenciojn kaj politikojn ene de OpenIM, ampleksante kodon, protokolojn, versiojn kaj pli.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Gvidlinioj kaj metodoj por API-konvertoj.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Registrado de politikoj kaj konvencioj en OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Proceduroj kaj konvencioj por CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Konvencioj por kodoj en OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Dosierujo-strukturo kaj konvencioj ene de OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Listo kaj priskriboj de erarkodoj.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konvencioj kaj konvertiĝoj por Go-kodo.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Administradstrategioj por OpenIM Docker-bildoj, ampleksante plurajn arkitekturojn kaj bilddeponejojn.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Pliaj detalaj konvencioj pri arbohakado.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Strategioj pri nomado kaj administrado por OpenIM-versioj.
## Por Programistoj, Kontribuantoj kaj Komunumaj Prizorgantoj
### Programistoj kaj Kontribuantoj
Se vi estas programisto aŭ iu fervora kontribui:
- Familiariĝu kun niaj [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) por certigi glatajn kontribuojn.
- Plonĝu en la[Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) por ekkompreni la evolupraktikojn en OpenIM.
### Komunumaj Prizorgantoj
Kiel komunuma prizorganto:
- Certigu, ke kontribuoj kongruas kun la normoj skizitaj en nia dokumentaro.
- Regule reviziu la [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) kaj [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) por resti ĝisdatigita.
## Por Uzantoj
Uzantoj devas aparte atenti:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Necesas se vi planas uzi Docker-bildojn de OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Por kompreni la malsamajn bildojn disponeblajn kaj kiel elekti la ĝustan por via arkitekturo.

View File

@@ -1,67 +0,0 @@
# Documentos del servidor OpenIM
¡Bienvenido al centro de documentación de OpenIM! Este centro proporciona una amplia gama de guías y manuales diseñados para ayudarle a aprovechar al máximo su experiencia OpenIM.
## Tabla de contenido
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Orientación sobre contribuciones y configuraciones para desarrolladores
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Convenciones de codificación, políticas de registro y otras herramientas de transformación
------
## Contribuir
Esta sección ofrece a los desarrolladores una guía detallada sobre cómo contribuir con código, configurar su entorno y seguir los procesos asociados.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Reglas y convenciones para escribir código en OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Una guía sobre cómo realizar el desarrollo dentro de OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Directrices sobre operaciones de selección selectiva.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - El flujo de trabajo de git en OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Orientación sobre la configuración e inicialización de OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Cómo instalar Docker en su máquina.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Guía para configurar el entorno de desarrollo en Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Lineamientos sobre cómo llevar a cabo determinadas acciones comunes a nivel local.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Métodos de implementación de OpenIM sin conexión.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Guía sobre el uso de herramientas de protocolo.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Herramientas y bibliotecas en OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Mejores prácticas y herramientas para Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Mejores prácticas y herramientas para scripts.
## Conversiones
Esta sección presenta varias convenciones y políticas dentro de OpenIM, que abarcan código, registros, versiones y más.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Directrices y métodos para conversiones de API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Políticas y convenciones de registro en OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Procedimientos y convenciones para CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Convenciones para confirmaciones de código en OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Estructura de directorios y convenciones dentro de OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Lista y descripciones de códigos de error.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Convenciones y conversiones para código Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Estrategias de gestión para imágenes OpenIM Docker, que abarcan múltiples arquitecturas y repositorios de imágenes.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Convenciones más detalladas sobre el registro.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Estrategias de nomenclatura y gestión de versiones OpenIM.
## Para desarrolladores, contribuyentes y mantenedores de la comunidad
### Desarrolladores y colaboradores
Si eres desarrollador o alguien interesado en contribuir:
- Familiarícese con nuestras [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) y [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) to ensure smooth contributions.
- Sumérgete en la [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) para familiarizarte con las prácticas de desarrollo en OpenIM.
### Mantenedores de la comunidad
Como mantenedor de la comunidad:
- Asegúrese de que las contribuciones se alineen con los estándares descritos en nuestra documentación.
- Revise periódicamente la [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) y los [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) para mantenerse actualizado.
## Para usuarios
Los usuarios deben prestar especial atención a:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Necesario si planea utilizar imágenes Docker de OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Comprender las diferentes imágenes disponibles y cómo elegir la adecuada para su arquitectura.

View File

@@ -1,67 +0,0 @@
# اسناد سرور OpenIM
به مرکز اسناد OpenIM خوش آمدید! این مرکز طیف گسترده ای از راهنماها و راهنماها را ارائه می دهد که به شما کمک می کند تا از تجربه OpenIM خود بیشترین بهره را ببرید.
## فهرست مطالب
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - راهنمایی در مورد مشارکت و تنظیمات برای توسعه دهندگان
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - کنوانسیون های کدگذاری، سیاست های ورود به سیستم و سایر ابزارهای تبدیل
------
## مشارکت
این بخش به توسعه دهندگان راهنمای دقیقی در مورد نحوه مشارکت کد، تنظیم محیط خود و پیروی از فرآیندهای مرتبط ارائه می دهد.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - قوانین و مقررات برای نوشتن کد در OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - راهنمای نحوه انجام توسعه در OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - دستورالعمل عملیات چیدن گیلاس
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - گردش کار git در OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - راهنمایی در مورد راه اندازی و مقداردهی اولیه OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - چگونه داکر را روی دستگاه خود نصب کنیم.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - راهنمای راه اندازی محیط توسعه در لینوکس.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - رهنمودهایی در مورد نحوه انجام برخی از اقدامات مشترک به صورت محلی.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - روش های استقرار OpenIM به صورت آفلاین
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - راهنمای استفاده از ابزار پروتک
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - ابزارها و کتابخانه ها در OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - بهترین روش ها و ابزارها برای Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - بهترین روش ها و ابزارها برای اسکریپت ها.
## تبدیل ها
این بخش قراردادها و سیاست‌های مختلفی را در OpenIM معرفی می‌کند که شامل کد، گزارش‌ها، نسخه‌ها و موارد دیگر می‌شود.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - دستورالعمل ها و روش های تبدیل API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - سیاست‌های ورود به سیستم و قراردادها در OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - رویه ها و قراردادها برای CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - کنوانسیون‌ها برای تعهدات کد در OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - ساختار دایرکتوری و قراردادها در OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - لیست و توضیحات کدهای خطا
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - کنوانسیون ها و تبدیل ها برای کد Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - استراتژی های مدیریتی برای تصاویر OpenIM Docker، شامل چندین معماری و مخازن تصویر.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - کنوانسیون های دقیق تر در مورد ورود به سیستم.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - استراتژی های نامگذاری و مدیریت برای نسخه های OpenIM.
## برای توسعه‌دهندگان، مشارکت‌کنندگان و نگهبانان انجمن
### توسعه دهندگان و مشارکت کنندگان
اگر توسعه‌دهنده هستید یا کسی که مشتاق مشارکت است:
- - برای اطمینان از مشارکت های روان، با [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) و [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) ما آشنا شوید.
- - در [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) شیرجه بزنید تا از شیوه های توسعه در OpenIM مطلع شوید.
### نگهبانان جامعه
به عنوان یک نگهدارنده جامعه:
- اطمینان حاصل کنید که مشارکت ها با استانداردهای ذکر شده در اسناد ما مطابقت دارند.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) و [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) را به‌طور مرتب مرور کنید تا به‌روز بمانید.
## برای کاربران
کاربران باید توجه ویژه ای به موارد زیر داشته باشند:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - اگر قصد دارید از تصاویر Docker OpenIM استفاده کنید، ضروری است.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - برای درک تصاویر مختلف موجود و نحوه انتخاب تصویر مناسب برای معماری خود.

View File

@@ -1,67 +0,0 @@
# OpenIM Server Docs
Tervetuloa OpenIM-dokumentaatiokeskukseen! Tämä keskus tarjoaa kattavan valikoiman oppaita ja oppaita, jotka on suunniteltu auttamaan sinua saamaan kaiken irti OpenIM-kokemuksestasi.
## Sisällysluettelo
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Ohjeita kehittäjille osallistumiseen ja määrityksiin
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Koodauskäytännöt, lokikäytännöt ja muut muunnostyökalut
------
## Contrib
Tämä osio tarjoaa kehittäjille yksityiskohtaisen oppaan koodin lisäämisestä, ympäristön määrittämisestä ja siihen liittyvien prosessien seuraamisesta.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Säännöt ja käytännöt koodin kirjoittamiselle OpenIM:ssä.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Opas kehitystyön toteuttamiseen OpenIM:ssä.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Kirsikoiden poimimista koskevat ohjeet.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Git-työnkulku OpenIM:ssä.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Ohjeita OpenIM:n käyttöönottoon ja alustamiseen.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Kuinka asentaa Docker koneellesi.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Ohje kehitysympäristön määrittämiseen Linuxissa.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Ohjeita tiettyjen yhteisten toimien toteuttamiseen paikallisesti.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - OpenIM:n offline-käyttöönottomenetelmät.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Opas protokollatyökalujen käyttöön.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - OpenIM for Go -työkalut ja kirjastot.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Makefilen parhaat käytännöt ja työkalut.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Skriptien parhaat käytännöt ja työkalut.
## Tulokset
Tässä osiossa esitellään erilaisia OpenIM:n käytäntöjä ja käytäntöjä, jotka kattavat koodin, lokit, versiot ja paljon muuta.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Ohjeita ja menetelmiä API-muunnoksille.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Kirjauskäytännöt ja käytännöt OpenIM:ssä.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD:n menettelyt ja käytännöt.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIM:n koodisitoumusten käytännöt.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Hakemistorakenne ja käytännöt OpenIM:ssä.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Luettelo ja kuvaukset virhekoodeista.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Go-koodin sopimukset ja muunnokset.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Hallintastrategiat OpenIM Docker -kuville, jotka kattavat useita arkkitehtuureja ja kuvavarastoja.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Tarkemmat hakkuiden käytännöt.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Nimeämis- ja hallintastrategiat OpenIM-versioille.
## Kehittäjille, avustajille ja yhteisön ylläpitäjille
### Kehittäjät ja avustajat
Jos olet kehittäjä tai joku, joka haluaa osallistua:
- Tutustu [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md)- ja [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) -käytäntöihimme varmistaaksesi sujuvan osallistumisen.
- Sukella [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) saadaksesi tietoa OpenIM:n kehityskäytännöistä.
### Yhteisön ylläpitäjät
Yhteisön ylläpitäjänä:
- Varmista, että osallistumiset ovat asiakirjoissamme esitettyjen standardien mukaisia.
- Tarkista säännöllisesti [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) ja [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) pysyäksesi ajan tasalla.
## Käyttäjille
Käyttäjien tulee kiinnittää erityistä huomiota:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Välttämätön, jos aiot käyttää OpenIM:n Docker-kuvia.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Ymmärtääksesi saatavilla olevat erilaiset kuvat ja kuinka valita oikea arkkitehtuuriisi.

View File

@@ -1,66 +0,0 @@
# Documentation du serveur OpenIM
Bienvenue dans le hub de documentation OpenIM ! Ce centre propose une gamme complète de guides et de manuels conçus pour vous aider à tirer le meilleur parti de votre expérience OpenIM.
## Table des matières
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Conseils sur la contribution et les configurations pour les développeurs
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Conventions de codage, politiques de journalisation et autres outils de transformation
------
## Contribuer
Cette section propose aux développeurs un guide détaillé sur la façon de contribuer au code, de configurer leur environnement et de suivre les processus associés.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Règles et conventions pour écrire du code dans OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Un guide sur la façon de réaliser du développement au sein d'OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Lignes directrices sur les opérations de triage.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Le flux de travail git dans OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Conseils sur la configuration et linitialisation dOpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Comment installer Docker sur votre machine.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Guide pour configurer l'environnement de développement sous Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Des lignes directrices pour mener localement certaines actions communes.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Méthodes de déploiement d'OpenIM hors ligne.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Guide sur l'utilisation des outils de protocole.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Outils et bibliothèques dans OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Meilleures pratiques et outils pour Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Meilleures pratiques et outils pour les scripts.
## Conversions
Cette section présente diverses conventions et politiques au sein d'OpenIM, englobant le code, les journaux, les versions, etc.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Lignes directrices et méthodes pour les conversions API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Politiques et conventions de journalisation dans OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Politiques et conventions de journalisation dans OpenIM.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Politiques et conventions de journalisation dans OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Structure de répertoire et conventions au sein d'OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Liste et descriptions des codes d'erreur.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Conventions et conversions pour le code Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Stratégies de gestion des images OpenIM Docker, couvrant plusieurs architectures et référentiels d'images.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Conventions plus détaillées sur la journalisation.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Stratégies de nommage et de gestion pour les versions OpenIM.
## Pour les développeurs, les contributeurs et les responsables de la communauté
### Développeurs et contributeurs
Si vous êtes un développeur ou quelqu'un désireux de contribuer :
- Familiarisez-vous avec nos [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) et notre [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) pour garantir des contributions fluides.
- Plongez dans le [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) pour vous familiariser avec les pratiques de développement dans OpenIM.
### Responsables de la communauté
En tant que responsable de la communauté :
- EAssurez-vous que les contributions sont conformes aux normes décrites dans notre documentation.
- onsultez régulièrement la [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) et les [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) pour rester à jour.
## Pour les utilisateurs
Les utilisateurs doivent prêter une attention particulière à :
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Nécessaire si vous prévoyez d'utiliser des images Docker d'OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Pour comprendre les différentes images disponibles et comment choisir celle qui convient à votre architecture.

View File

@@ -1,67 +0,0 @@
# OpenIM Server Docs
Üdvözöljük az OpenIM dokumentációs központjában! Ez a központ útmutatók és kézikönyvek átfogó választékát kínálja, amelyek célja, hogy a legtöbbet hozza ki az OpenIM-élményből.
## Tartalomjegyzék
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Útmutató a fejlesztőknek a hozzájáruláshoz és a konfigurációkhoz
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Kódolási konvenciók, naplózási szabályzatok és egyéb átalakítási eszközök
------
## Contrib
Ez a rész részletes útmutatót nyújt a fejlesztőknek a kód hozzáadásával, a környezet beállításával és a kapcsolódó folyamatok követésével kapcsolatban.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Az OpenIM kódírásának szabályai és konvenciói.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Útmutató az OpenIM-en belüli fejlesztés végrehajtásához.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Útmutató a cseresznyeszedési műveletekhez.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - A git munkafolyamat az OpenIM-ben.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Útmutató az OpenIM beállításához és inicializálásához.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - A Docker telepítése a gépére.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Guide to set up the development environment on Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Útmutató a fejlesztői környezet beállításához Linuxon.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Az OpenIM offline üzembe helyezésének módszerei.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Útmutató a protokolleszközök használatához.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Eszközök és könyvtárak az OpenIM for Go-ban.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - A Makefile legjobb gyakorlatai és eszközei.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Bevált módszerek és eszközök a szkriptekhez.
## Conversions
Ez a rész az OpenIM különféle konvencióit és szabályzatait mutatja be, beleértve a kódot, a naplókat, a verziókat és egyebeket.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Irányelvek és módszerek az API-konverziókhoz.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Naplózási szabályzatok és konvenciók az OpenIM-ben.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD eljárások és konvenciók.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - A kód véglegesítésének konvenciói az OpenIM-ben.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Címtárszerkezet és konvenciók az OpenIM-en belül.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - A hibakódok listája és leírása.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konvenciók és átalakítások a Go kódhoz.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Kezelési stratégiák az OpenIM Docker-képekhez, amelyek több architektúrára és képtárra is kiterjednek.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - További részletes egyezmények a fakitermelésről.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Elnevezési és kezelési stratégiák az OpenIM verziókhoz.
## Fejlesztőknek, közreműködőknek és közösségi fenntartóknak
### Fejlesztők és közreműködők
Ha Ön fejlesztő vagy valaki, aki szeretne hozzájárulni:
- A zökkenőmentes hozzájárulás érdekében ismerkedjen meg [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) és [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md)-val.
- Merüljön el a [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md), hogy megismerje az OpenIM fejlesztési gyakorlatát.
### Közösségfenntartók
Közösségfenntartóként:
- Győződjön meg arról, hogy a hozzájárulások megfelelnek a dokumentációnkban felvázolt szabványoknak.
- Rendszeresen tekintse át a [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) és a [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md), hogy naprakész maradjon.
## Felhasználóknak
A felhasználóknak különös figyelmet kell fordítaniuk a következőkre:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Szükséges, ha az OpenIM Docker-képeit szeretné használni.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Hogy megértse a rendelkezésre álló különböző képeket, és hogyan válassza ki a megfelelőt az építészetéhez.

View File

@@ -1,67 +0,0 @@
# Dokumen Server OpenIM
Selamat datang di pusat Dokumentasi OpenIM! Pusat ini menyediakan berbagai panduan dan manual yang komprehensif untuk membantu Anda memaksimalkan pengalaman Anda dengan OpenIM.
## Daftar Isi
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Panduan tentang kontribusi dan konfigurasi untuk pengembang
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Konvensi pengkodean, kebijakan logging, dan alat transformasi lainnya
------
## Contrib
Bagian ini menawarkan panduan rinci bagi pengembang tentang cara berkontribusi kode, menyiapkan lingkungan mereka, dan mengikuti proses yang terkait.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Aturan dan konvensi untuk menulis kode di OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Panduan tentang cara melakukan pengembangan di dalam OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Pedoman tentang operasi cherry-picking.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Alur kerja git di OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Panduan untuk mengatur dan menginisialisasi OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Cara memasang Docker di mesin Anda.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Panduan untuk menyiapkan lingkungan pengembangan di Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Pedoman tentang cara melakukan beberapa tindakan umum secara lokal.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Metode penyebaran OpenIM secara offline.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Panduan tentang menggunakan alat protoc.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Alat dan perpustakaan di OpenIM untuk Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Praktik terbaik dan alat untuk Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Praktik terbaik dan alat untuk skrip.
## Conversions
Bagian ini memperkenalkan berbagai konvensi dan kebijakan dalam OpenIM, meliputi kode, log, versi, dan lainnya.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Pedoman dan metode untuk konversi API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Kebijakan dan konvensi logging di OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Prosedur dan konvensi untuk CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Konvensi untuk commit kode di OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Struktur direktori dan konvensi dalam OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Daftar dan deskripsi kode kesalahan.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konvensi dan konversi untuk kode Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Strategi manajemen gambar Docker OpenIM, mencakup berbagai arsitektur dan repositori gambar.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Konvensi logging yang lebih detail.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Strategi penamaan dan manajemen versi OpenIM.
## Untuk Pengembang, Kontributor, dan Pemelihara Komunitas
### Pengembang & Kontributor
Jika Anda seorang pengembang atau seseorang yang ingin berkontribusi:
- Kenali [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) dan [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) kami untuk memastikan kontribusi yang lancar.
- Pelajari [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) untuk memahami praktik pengembangan di OpenIM.
### Pemelihara Komunitas
Sebagai pemelihara komunitas:
- Pastikan kontribusi sesuai dengan standar yang diuraikan dalam dokumentasi kami.
- Tinjau secara teratur [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) dan [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) untuk tetap terupdate.
## Untuk Pengguna
Pengguna harus memberikan perhatian khusus kepada:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Diperlukan jika Anda berencana menggunakan gambar Docker dari OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Untuk memahami gambar yang tersedia dan bagaimana memilih yang tepat untuk arsitektur Anda.

View File

@@ -1,67 +0,0 @@
# Documentazione del Server OpenIM
Benvenuti al centro documentazione di OpenIM! Questo centro offre una gamma completa di guide e manuali progettati per aiutarvi a ottenere il massimo dalla vostra esperienza con OpenIM.
## Indice dei Contenuti
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Guida al contributo e alle configurazioni per gli sviluppatori
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Convenzioni di codifica, politiche di registrazione e altri strumenti di trasformazione
------
## Contrib
Questa sezione offre agli sviluppatori una guida dettagliata su come contribuire al codice, configurare il loro ambiente e seguire i processi associati.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Regole e convenzioni per scrivere codice in OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Una guida su come svolgere lo sviluppo all'interno di OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Linee guida sulle operazioni di cherry-picking.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Il flusso di lavoro git in OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Guida per configurare e inizializzare OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Come installare Docker sul tuo dispositivo.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Guida per configurare l'ambiente di sviluppo su Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Linee guida su come eseguire determinate azioni comuni localmente.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Metodi per distribuire OpenIM offline.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Guida all'uso degli strumenti protoc.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Strumenti e librerie in OpenIM per Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Migliori pratiche e strumenti per Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Migliori pratiche e strumenti per gli script.
## Conversions
Questa sezione introduce varie convenzioni e politiche all'interno di OpenIM, che comprendono codice, registrazioni, versioni e altro.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Linee guida e metodi per le conversioni API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Politiche e convenzioni di registrazione in OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Procedure e convenzioni per CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Convenzioni per i commit di codice in OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Struttura delle directory e convenzioni all'interno di OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Elenco e descrizioni dei codici di errore.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Convenzioni e conversioni per il codice Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Strategie di gestione delle immagini Docker di OpenIM, che coprono più architetture e repository di immagini.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Ulteriori dettagliate convenzioni sulla registrazione.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Strategie di denominazione e gestione delle versioni di OpenIM.
## Per Sviluppatori, Contributori e Manutentori della Comunità
### Sviluppatori & Contributori
Se sei uno sviluppatore o qualcuno interessato a contribuire:
- Familiarizza con le nostre [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) e [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) per garantire contributi fluidi.
- Approfondisci la [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) per ottenere una conoscenza delle pratiche di sviluppo in OpenIM.
### Manutentori della Comunità
Come manutentore della comunità:
- Assicurati che i contributi siano in linea con gli standard delineati nella nostra documentazione.
- Rivedi regolarmente la [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) e [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) per rimanere aggiornato.
## Per gli Utenti
Gli utenti dovrebbero prestare particolare attenzione a:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Necessario se si prevede di utilizzare le immagini Docker di OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Per comprendere le diverse immagini disponibili e come scegliere quella giusta per la propria architettura.

View File

@@ -1,67 +0,0 @@
# OpenIMサーバードキュメンテーション
OpenIMドキュメンテーションハブへようこそこのセンターでは、OpenIM体験を最大限に活用するための包括的なガイドとマニュアルを提供しています。
## 目次
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 開発者向けの貢献と設定に関するガイダンス
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - コーディング規約、ログポリシー、その他の変換ツール
------
## 投稿
このセクションでは、開発者がコードを貢献し、環境を設定し、関連するプロセスに従う方法についての詳細なガイドを提供します。
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - OpenIMでのコード記述のルールと規約。
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - OpenIM内での開発を行うためのガイド。
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - チェリーピッキング操作のガイドライン。
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - OpenIMにおけるGitのワークフロー。
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - OpenIMの設定と初期化に関するガイダンス。
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - マシンにDockerをインストールする方法。
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Linux上での開発環境の設定ガイド。
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - ローカルで一般的なアクションを実行する方法に関するガイドライン。
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - OpenIMをオフラインでデプロイする方法。
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - protocツールの使用ガイド。
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - GoのためのOpenIM内のツールとライブラリ。
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Makefileのベストプラクティスとツール。
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - スクリプトのベストプラクティスとツール。
## Conversions
このセクションでは、OpenIM内のさまざまな規約とポリシーを紹介します。これには、コード、ログ、バージョンなどが含まれます。
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - API変換のためのガイドラインと方法。
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - OpenIMにおけるログポリシーと規約。
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CDの手順と規約。
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIMでのコードコミットのための規約。
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - OpenIM内のディレクトリ構造と規約。
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - エラーコードのリストと説明。
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Goコードのための規約と変換。
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - 複数のアーキテクチャとイメージリポジトリにまたがるOpenIM Dockerイメージの管理戦略。
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - ロギングに関するさらに詳細な規約。
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - OpenIMバージョンの命名と管理戦略。
## 開発者、コントリビューター、コミュニティメンテナー向け
### 開発者およびコントリビューター
開発者または貢献に熱心な方へ:
- スムーズな貢献を確実にするために、私たちの[Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md)と[Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md)に慣れ親しみましょう。
- OpenIMの開発実践に慣れるために、[Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md)をご覧ください。
### コミュニティメンテナー
コミュニティメンテナーとして:
- 貢献が私たちのドキュメンテーションで概説された基準に沿っていることを確認してください。
- 最新の情報を得るために、定期的に[Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md)と[Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md)をレビューしてください。
## ユーザー向け
ユーザーは特に以下の点に注意してください:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - OpenIMのDockerイメージを使用する予定の場合に必要です。
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - 利用可能なさまざまなイメージを理解し、アーキテクチャに適したものを選択する方法。

View File

@@ -1,67 +0,0 @@
# OpenIM 서버 문서
OpenIM 문서 허브에 오신 것을 환영합니다! 이 센터는 OpenIM 경험을 최대한 활용하는 데 도움이 되도록 다양한 가이드와 매뉴얼을 제공합니다.
## 목차
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 개발자를 위한 기여 및 구성에 대한 안내
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 코딩 규칙, 로깅 정책 및 기타 변환 도구
------
## 기여
이 섹션은 개발자들에게 코드를 기여하는 방법, 환경을 설정하는 방법 및 관련 프로세스를 따르는 방법에 대한 자세한 가이드를 제공합니다.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - OpenIM에서 코드를 작성하기 위한 규칙 및 규약.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - OpenIM 내에서 개발을 수행하는 방법에 대한 가이드.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - 체리피킹 작업에 대한 지침.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - OpenIM에서의 깃 워크플로우.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - OpenIM 설정 및 초기화에 대한 안내.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - 컴퓨터에 도커를 설치하는 방법.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - 리눅스에서 개발 환경을 설정하는 가이드.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - 일부 일반적인 작업을 로컬에서 수행하는 방법에 대한 지침.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - 오프라인에서 OpenIM을 배포하는 방법.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - 프로토콜 도구 사용에 대한 가이드.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Go용 OpenIM 도구 및 라이브러리.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - 메이크파일을 위한 모범 사례 및 도구.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - 스크립트를 위한 모범 사례 및 도구.
## 전환
이 섹션에서는 코드, 로그, 버전 등을 포함하는 OpenIM 내의 다양한 규칙과 정책을 소개합니다.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - API 변환을 위한 지침 및 방법.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - OpenIM의 로깅 정책 및 관습.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD 절차 및 관습.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIM에서 코드 커밋을 위한 관습.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - OpenIM 내의 디렉토리 구조 및 관습.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - 오류 코드 목록 및 설명.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Go 코드를 위한 관습 및 변환.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - 다양한 아키텍처 및 이미지 저장소를 아우르는 OpenIM Docker 이미지 관리 전략.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - 로깅에 대한 추가적인 상세한 관습.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - OpenIM 버전의 명명 및 관리 전략.
## 개발자, 기여자 및 커뮤니티 관리자를 위한 정보
### 개발자 및 기여자
개발자이거나 기여에 관심이 있다면:
- 원활한 기여를 위해 [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) 및 [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md)에 익숙해지십시오.
- OpenIM에서의 개발 관행을 파악하려면 [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md)를 참조하십시오.
### 커뮤니티 관리자
커뮤니티 관리자로서:
- 기여가 우리 문서에 명시된 표준에 부합하는지 확인하십시오.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) 및 [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md)를 정기적으로 검토하여 최신 정보를 유지하십시오.
## 사용자를 위한 정보
사용자는 특히 다음 사항에 주의를 기울여야 합니다:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - OpenIM의 Docker 이미지를 사용할 계획이라면 필요합니다.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - 사용 가능한 다양한 이미지를 이해하고 아키텍처에 적합한 이미지를 선택하는 방법.

View File

@@ -1,67 +0,0 @@
# OpenIM സെർവർ ഡോക്യുമെന്റേഷൻ
OpenIM ഡോക്യുമെന്റേഷൻ ഹബ്ബിലേക്ക് സ്വാഗതം! ഈ കേന്ദ്രം OpenIM അനുഭവത്തിൽ നിന്ന് പരമാവധി ഉപയോഗം നേടാൻ സഹായിക്കുന്ന വ്യാപകമായ നിർദേശങ്ങളുടെയും മാനുവലുകളുടെയും ശ്രേണി നൽകുന്നു.
## ഉള്ളടക്കം
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - ഡെവലപ്പർമാർക്കുള്ള സംഭാവനകൾ നൽകുന്നതിനും കോൺഫിഗറേഷനുകൾക്കുള്ള നിർദേശങ്ങൾ
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - കോഡിംഗ് കൺവെൻഷനുകൾ, ലോഗ്ഗിംഗ് നയങ്ങൾ, മറ്റ് പരിവർത്തന ഉപകരണങ്ങൾ
------
## Contrib
ഈ ഭാഗം ഡെവലപ്പർമാർക്ക് കോഡ് സംഭാവന നൽകുന്നതിന്റെയും അവരുടെ പരിസ്ഥിതി സജ്ജമാക്കുന്നതിന്റെയും ബന്ധപ്പെട്ട പ്രക്രിയകൾ പിന്തുടരുന്നതിന്റെയും വിശദമായ ഗൈഡ് നൽകുന്നു.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - OpenIM-ൽ കോഡ് എഴുതുന്നതിന്റെ നിയമങ്ങൾ കൺവെൻഷനുകൾ.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - OpenIM-ൽ വികസനം നടത്തുന്നതിന്റെ ഗൈഡ്.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - ചെറി-പിക്കിംഗ് ഓപ്പറേഷനുകൾക്കുള്ള മാർഗ്ഗനിർദേശങ്ങൾ.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - OpenIM-ൽ ഗിറ്റിന്റെ വർക്ക്ഫ്ലോ.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - OpenIM സജ്ജമാക്കുന്നതിനും ആരംഭിക്കുന്നതിനും നിർദേശങ്ങൾ.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - നിങ്ങളുടെ യന്ത്രത്തിൽ ഡോക്കർ ഇൻസ്റ്റാൾ ചെയ്യുന്ന രീതി.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - ലിനക്സിൽ വികസന പരിസ്ഥിതി സജ്ജമാക്കുന്നതിന്റെ ഗൈഡ്.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - ചില പൊതുവായ നടപടികൾ പ്രദേശികമായി നടത്തുന്നതിന്റെ മാർഗ്ഗനിർദേശങ്ങൾ.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - OpenIM ഓഫ്‌ലൈൻ ഡിപ്ലോയ് ചെയ്യുന്ന രീതികൾ.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - പ്രോട്ടോക് ഉപകരണങ്ങൾ ഉപയോഗിക്കുന്ന ഗൈഡ്.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Go വേണ്ടി OpenIM-ൽ ഉള്ള ഉപകരണങ്ങളും ലൈബ്രറികളും.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Makefile ഉപകരണങ്ങളുടെയും മികച്ച പ്രാക്ടീസുകളുടെയും ഗൈഡ്.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - സ്ക്രിപ്റ്റുകൾക്കുള്ള മികച്ച പ്രാക്ടീസുകളും ഉപകരണങ്ങളും.
## Conversions
ഈ ഭാഗം OpenIM-ൽ ഉള്ള വിവിധ കൺവെൻഷനുകളെയും നയങ്ങളെയും ആവിഷ്കരിക്കുന്നു, ഇതിൽ കോഡ്, ലോഗുകൾ, പതിപ്പുകൾ എന്നിവ ഉൾപ്പെടുന്നു.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - API കൺവെർഷനുകൾക്കുള്ള നിർദേശങ്ങൾ രീതികൾ.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - OpenIM-ൽ ലോഗ്ഗിംഗ് നയങ്ങൾ കൺവെൻഷനുകൾ.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD പ്രക്രിയകൾ കൺവെൻഷനുകൾ.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIM-ൽ കോഡ് കമ്മിറ്റുകൾക്കുള്ള കൺവെൻഷനുകൾ.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - OpenIM-ൽ ഡയറക്ടറി ഘടന കൺവെൻഷനുകൾ.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - പിശക് കോഡുകളുടെ പട്ടിക വിവരണങ്ങൾ.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Go കോഡിനുള്ള കൺവെൻഷനുകൾ പരിവർത്തനങ്ങൾ.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - വിവിധ ആർക്കിടെക്ചറുകൾ ഇമേജ് റെപ്പോസിറ്ററികൾ ഉൾപ്പെടുന്ന OpenIM Docker ഇമേജുകളുടെ മാനേജ്മെന്റ് സ്ട്രാറ്റജീസ്.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - ലോഗ്ഗിംഗിന്റെ കൂടുതൽ വിശദമായ കൺവെൻഷനുകൾ.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - OpenIM പതിപ്പുകൾക്കുള്ള നാമകരണ മാനേജ്മെന്റ് സ്ട്രാറ്റജീസ്.
## ഡെവലപ്പർമാർക്കും, സംഭാവനകൾ നൽകുന്നവർക്കും, കമ്മ്യൂണിറ്റി മെയിന്റെയിനർമാർക്കും
### ഡെവലപ്പർമാർ & സംഭാവനകൾ നൽകുന്നവർ
നിങ്ങൾ ഒരു ഡെവലപ്പർ അല്ലെങ്കിൽ സംഭാവനകൾ നൽകാൻ ആഗ്രഹിക്കുന്ന ആളാണെങ്കിൽ:
- നിരവധി സംഭാവനകൾ ഉറപ്പാക്കാൻ ഞങ്ങളുടെ [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) എന്നിവയുമായി പരിചിതരാകുക.
- OpenIM-ൽ വികസന പ്രാക്ടീസുകൾ ലഭ്യമാക്കാൻ [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) അന്വേഷിക്കുക.
### കമ്മ്യൂണിറ്റി മെയിന്റെയിനർമാർ
ഒരു കമ്മ്യൂണിറ്റി മെയിന്റെയിനറായി:
- സംഭാവനകൾ ഞങ്ങളുടെ ഡോക്യുമെന്റേഷനിൽ വിവരിച്ച മാനദണ്ഡങ്ങൾക്ക് അനുസൃതമാണെന്ന് ഉറപ്പാക്കുക.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) എന്നിവ പുതുക്കി വായിക്കുക.
## ഉപയോക്താക്കൾക്ക്
ഉപയോക്താക്കൾ പ്രത്യേകം ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - OpenIM-ന്റെ ഡോക്കർ ഇമേജുകൾ ഉപയോഗിക്കാൻ പദ്ധതിയിടുന്നെങ്കിൽ ആവശ്യമാണ്.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - ലഭ്യമായ വിവിധ ഇമേജുകൾ മനസ്സിലാക്കുകയും നിങ്ങളുടെ ആർക്കിടെക്ചറിന് അനുയോജ്യമായത് എങ്ങനെ തിരഞ്ഞെടുക്കണം എന്ന് അറിയുക.

View File

@@ -1,67 +0,0 @@
# OpenIM Server-documenten
Welkom bij de OpenIM-documentatiehub! Dit centrum biedt een uitgebreide reeks handleidingen en handleidingen die zijn ontworpen om u te helpen het meeste uit uw OpenIM-ervaring te halen.
## Inhoudsopgave
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Richtlijnen voor bijdragen en configuraties voor ontwikkelaars
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Codeerconventies, logboekbeleid en andere transformatietools
------
## Draag bij
Deze sectie biedt ontwikkelaars een gedetailleerde handleiding over hoe ze code kunnen bijdragen, hun omgeving kunnen instellen en de bijbehorende processen kunnen volgen.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Regels en conventies voor het schrijven van code in OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Een handleiding voor het uitvoeren van ontwikkelingen binnen OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Richtlijnen voor kersenplukoperaties.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - De git-workflow in OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Begeleiding bij het instellen en initialiseren van OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Hoe Docker op uw machine te installeren.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Handleiding voor het opzetten van de ontwikkelomgeving op Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Richtlijnen voor het lokaal uitvoeren van bepaalde gemeenschappelijke acties.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Methoden voor het offline inzetten van OpenIM.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Handleiding voor het gebruik van protocoltools.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Tools en bibliotheken in OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Best practices en tools voor Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Best practices en tools voor scripts.
## Conversies
In deze sectie worden verschillende conventies en beleidsregels binnen OpenIM geïntroduceerd, waaronder code, logs, versies en meer.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Richtlijnen en methoden voor API-conversies.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Logboekbeleid en -conventies in OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Procedures en conventies voor CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Conventies voor code-commits in OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Directorystructuur en conventies binnen OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Lijst en beschrijvingen van foutcodes.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Conventies en conversies voor Go-code.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Beheerstrategieën voor OpenIM Docker-images, verspreid over meerdere architecturen en image-opslagplaatsen.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Verdere gedetailleerde conventies over houtkap.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Naamgevings- en beheerstrategieën voor OpenIM-versies.
## Voor ontwikkelaars, bijdragers en communitybeheerders
### Ontwikkelaars en bijdragers
Als u een ontwikkelaar bent of iemand die graag een bijdrage wil leveren:
- Maak uzelf vertrouwd met onze [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) en [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) om soepele bijdragen te garanderen.
- Duik in de [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) om de ontwikkelpraktijken in OpenIM onder de knie te krijgen.
### Gemeenschapsbeheerders
Als gemeenschapsbeheerder:
- Zorg ervoor dat bijdragen in overeenstemming zijn met de normen die in onze documentatie worden beschreven.
- Controleer regelmatig het [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) en de [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) om op de hoogte te blijven.
## Voor gebruikers
Gebruikers moeten bijzondere aandacht besteden aan:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Noodzakelijk als u van plan bent Docker-images van OpenIM te gebruiken.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Om de verschillende beschikbare afbeeldingen te begrijpen en hoe u de juiste voor uw architectuur kiest.

View File

@@ -1,67 +0,0 @@
# Dokumentacja serwera OpenIM
Witamy w centrum dokumentacji OpenIM! Centrum to zapewnia kompleksową gamę przewodników i podręczników zaprojektowanych, aby pomóc Ci w pełni wykorzystać możliwości OpenIM.
## Spis treści
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Wskazówki dotyczące współtworzenia i konfiguracji dla programistów
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Konwencje kodowania, zasady rejestrowania i inne narzędzia do transformacji
------
## Wkład
W tej sekcji deweloperzy mogą znaleźć szczegółowy przewodnik dotyczący udostępniania kodu, konfigurowania środowiska i wykonywania powiązanych procesów.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Zasady i konwencje pisania kodu w OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Poradnik dotyczący programowania w OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Wytyczne dotyczące operacji zbierania wiśni.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Przepływ pracy git w OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Wskazówki dotyczące konfigurowania i inicjowania OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Jak zainstalować Docker na swoim komputerze.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Przewodnik po konfigurowaniu środowiska programistycznego w systemie Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Wytyczne dotyczące sposobu przeprowadzania niektórych typowych działań lokalnie.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Metody wdrażania OpenIM offline.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Przewodnik dotyczący korzystania z narzędzi protoc.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Narzędzia i biblioteki w OpenIM for Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Najlepsze praktyki i narzędzia dla Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Najlepsze praktyki i narzędzia dotyczące skryptów.
## Konwersje
W tej sekcji przedstawiono różne konwencje i zasady w OpenIM, obejmujące kod, dzienniki, wersje i nie tylko.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Wytyczne i metody konwersji API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Zasady i konwencje rejestrowania w OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Procedury i konwencje dotyczące CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Konwencje dotyczące zatwierdzania kodu w OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Struktura katalogów i konwencje w OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Lista i opisy kodów błędów.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Konwencje i konwersje dla kodu Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Strategie zarządzania obrazami Dockera OpenIM obejmujące wiele architektur i repozytoriów obrazów.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Dalsze szczegółowe konwencje dotyczące pozyskiwania drewna.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Strategie nazewnictwa i zarządzania wersjami OpenIM.
## Dla programistów, współpracowników i opiekunów społeczności
### Programiści i współpracownicy
Jeśli jesteś programistą lub osobą, która chce wnieść swój wkład:
- Zapoznaj się z naszymi [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) i [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md), aby zapewnić płynną współpracę.
- Zajrzyj do [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md), aby zapoznać się z praktykami programistycznymi w OpenIM.
### Opiekunowie społeczności
Jako opiekun społeczności:
- Upewnij się, że wkład jest zgodny ze standardami określonymi w naszej dokumentacji.
- Regularnie przeglądaj [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) i [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md), aby być na bieżąco.
## Dla Użytkowników
Użytkownicy powinni zwrócić szczególną uwagę na:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Niezbędne, jeśli planujesz używać obrazów Dockera OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Aby zrozumieć różne dostępne obrazy i dowiedzieć się, jak wybrać odpowiedni dla swojej architektury.

View File

@@ -1,67 +0,0 @@
# Documentação do Servidor OpenIM
Bem-vindo ao centro de documentação do OpenIM! Este centro oferece uma ampla gama de guias e manuais projetados para ajudá-lo a aproveitar ao máximo sua experiência com o OpenIM.
## Índice de Conteúdos
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Orientações sobre contribuições e configurações para desenvolvedores
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Convenções de codificação, políticas de registro e outras ferramentas de transformação
------
## Contrib
Esta seção oferece aos desenvolvedores um guia detalhado sobre como contribuir com código, configurar seu ambiente e seguir os processos associados.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Regras e convenções para escrever código no OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Um guia sobre como realizar o desenvolvimento dentro do OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Diretrizes sobre operações de cherry-picking.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - O fluxo de trabalho git no OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Orientações sobre configuração e inicialização do OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Como instalar o Docker em sua máquina.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Guia para configurar o ambiente de desenvolvimento no Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Diretrizes sobre como realizar certas ações comuns localmente.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Métodos para implantar o OpenIM offline.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Guia sobre o uso de ferramentas protoc.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Ferramentas e bibliotecas no OpenIM para Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Melhores práticas e ferramentas para Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Melhores práticas e ferramentas para scripts.
## Conversions
Esta seção apresenta várias convenções e políticas dentro do OpenIM, abrangendo código, logs, versões e mais.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Diretrizes e métodos para conversões de API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Políticas e convenções de registro no OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Procedimentos e convenções para CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Convenções para commits de código no OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Estrutura de diretórios e convenções dentro do OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Lista e descrições de códigos de erro.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Convenções e conversões para código Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Estratégias de gerenciamento para imagens Docker do OpenIM, abrangendo várias arquiteturas e repositórios de imagens.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Convenções mais detalhadas sobre registro.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Estratégias de nomeação e gerenciamento para versões do OpenIM.
## Para Desenvolvedores, Contribuidores e Mantenedores da Comunidade
### Desenvolvedores & Contribuidores
Se você é um desenvolvedor ou alguém interessado em contribuir:
- Familiarize-se com nossas [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) e [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) para garantir contribuições suaves.
- Mergulhe no [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) para se familiarizar com as práticas de desenvolvimento no OpenIM.
### Mantenedores da Comunidade
Como mantenedor da comunidade:
- Garanta que as contribuições estejam alinhadas com os padrões descritos em nossa documentação.
- Reveja regularmente a [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) e [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) para se manter atualizado.
## Para Usuários
Os usuários devem prestar atenção especial a:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Necessário se você planeja usar imagens Docker do OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Para entender as diferentes imagens disponíveis e como escolher a certa para a sua arquitetura.

View File

@@ -1,67 +0,0 @@
# Документация по серверу OpenIM
Добро пожаловать в центр документации OpenIM! Этот центр предоставляет широкий спектр руководств и руководств, призванных помочь вам максимально эффективно использовать возможности OpenIM.
## Оглавление
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Руководство по участию и настройке для разработчиков
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Соглашения по кодированию, политики ведения журналов и другие инструменты преобразования.
------
## Вклад
В этом разделе разработчикам предлагается подробное руководство о том, как добавлять код, настраивать среду и следовать соответствующим процессам.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Правила и соглашения по написанию кода в OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Руководство о том, как вести разработку в OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Руководство по сбору урожая.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Рабочий процесс git в OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Руководство по настройке и инициализации OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Как установить Docker на свой компьютер.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Руководство по настройке среды разработки в Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Рекомендации о том, как выполнять определенные общие действия на местном уровне.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Способы развертывания OpenIM в автономном режиме.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Руководство по использованию инструментов протокола.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Инструменты и библиотеки в OpenIM для Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Лучшие практики и инструменты для Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Лучшие практики и инструменты для сценариев.
## Конверсии
В этом разделе представлены различные соглашения и политики OpenIM, включая код, журналы, версии и многое другое.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Рекомендации и методы преобразования API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Политики и соглашения ведения журналов в OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Процедуры и соглашения для CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Соглашения о фиксации кода в OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Структура каталогов и соглашения в OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Список и описание кодов ошибок.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Соглашения и преобразования для кода Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Стратегии управления образами OpenIM Docker, охватывающими несколько архитектур и репозиториев изображений.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Дальнейшие подробные соглашения о ведении журнала.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Стратегии именования и управления версиями OpenIM.
## Для разработчиков, участников и сопровождающих сообщества
### Разработчики и участники
Если вы разработчик или кто-то хочет внести свой вклад:
- Ознакомьтесь с нашими [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) и [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md), чтобы обеспечить бесперебойную работу.
- Погрузитесь в [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md), чтобы ознакомиться с методами разработки в OpenIM.
### Сопровождающие сообщества
Как администратор сообщества:
- Убедитесь, что вклады соответствуют стандартам, изложенным в нашей документации.
- Регулярно просматривайте [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) и [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md), чтобы оставаться в курсе событий.
## Для пользователей
Пользователям следует обратить особое внимание на:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Необходимо, если вы планируете использовать Docker-образы OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Чтобы понять различные доступные изображения и как выбрать подходящее для вашей архитектуры.

View File

@@ -1,67 +0,0 @@
# OpenIM Sunucu Belgeleri
OpenIM Belgeleri merkezine hoş geldiniz! Bu merkez, OpenIM deneyiminizden en iyi şekilde faydalanmanıza yardımcı olmak için tasarlanmış kapsamlı bir rehber ve kılavuzlar koleksiyonu sunar.
## İçindekiler
1. [Katılım](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Geliştiriciler için katkıda bulunma ve yapılandırma rehberi
2. [Dönüşümler](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Kodlama kuralları, günlükleme politikaları ve diğer dönüşüm araçları
------
## Katılım
Bu bölüm, geliştiricilere kod katkısında bulunma, çevrelerini kurma ve ilişkilendirilmiş süreçleri takip etme konusunda detaylı bir rehber sunar.
- [Kod Kuralları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - OpenIM'de kod yazma kuralları ve gelenekleri.
- [Geliştirme Rehberi](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - OpenIM içinde geliştirme nasıl yapılır konusunda bir rehber.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Cherry-pick işlemleri için yönergeler.
- [Git Çalışma Akışı](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - OpenIM'deki git çalışma akışı.
- [Başlangıç Yapılandırmaları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - OpenIM'i kurma ve başlatma konusunda rehberlik.
- [Docker Kurulumu](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Makinenize Docker nasıl kurulur.
- [Linux Geliştirme Ortamı](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Linux üzerinde geliştirme ortamını kurma kılavuzu.
- [Yerel İşlemler](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Yerelde belirli yaygın işlemleri nasıl gerçekleştireceğiniz hakkında yönergeler.
- [Çevrimdışı Dağıtım](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - OpenIM'in çevrimdışı nasıl dağıtılacağı yöntemleri.
- [Protoc Araçları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Protoc araçlarını kullanma rehberi.
- [Go Araçları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Go için OpenIM'deki araçlar ve kütüphaneler.
- [Makefile Araçları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Makefile için en iyi uygulamalar ve araçlar.
- [Betik Araçları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Betikler için en iyi uygulamalar ve araçlar.
## Dönüşümler
Bu bölüm, kod, günlükler, sürümler ve daha fazlasını içeren çeşitli OpenIM içindeki kuralları ve politikaları tanıtır.
- [API Dönüşümleri](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - API dönüşümleri için yönergeler ve yöntemler.
- [Günlükleme Politikası](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - OpenIM'deki günlükleme politikaları ve gelenekleri.
- [CI/CD İşlemleri](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD için prosedürler ve gelenekler.
- [Taahhüt Kuralları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIM'deki kod taahhütleri için kurallar.
- [Dizin Kuralları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - OpenIM içindeki dizin yapısı ve kurallar.
- [Hata Kodları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Hata kodlarının listesi ve açıklamaları.
- [Go Kod Dönüşümleri](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Go kodu için kurallar ve dönüşümler.
- [Docker İmaj Stratejisi](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - OpenIM Docker imajlarının yönetim stratejileri, birden fazla mimariyi ve imaj depolarını kapsar.
- [Günlükleme Kuralları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Günlükleme hakkında daha fazla ayrıntılı kurallar.
- [Sürüm Kuralları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - OpenIM sürümleri için adlandırma ve yönetim stratejileri.
## Geliştiriciler, Katkıda Bulunanlar ve Topluluk Bakımı
### Geliştiriciler & Katkıda Bulunanlar
Eğer bir geliştirici veya katkıda bulunmaya hevesli biriyseniz:
- Katkılarınızı düzgün bir şekilde yapmak için [Kod Kuralları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) ve [Git Çalışma Akışı](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) ile tanışın.
- OpenIM'deki geliştirme uygulamalarını anlamak için [Geliştirme Rehberi'ne](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) göz atın.
### Topluluk Bakımı
Topluluk bakımı olarak:
- Katkıların belirtilen standartlarla uyumlu olduğundan emin olun.
- [Günlükleme Politikası](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) ve [Hata Kodları](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) sık sık gözden geçirerek güncel kalın.
## Kullanıcılar İçin
Kullanıcılar, özellikle dikkat etmelidir:
- [Docker Kurulumu](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - OpenIM Docker imajlarını kullanmayı planlıyorsanız gereklidir.
- [Docker İmaj Stratejisi](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Mevcut farklı imajları anlamak ve mimarinize uygun olanı nasıl seçeceğinizi öğrenmek için.

View File

@@ -1,67 +0,0 @@
# OpenIM Server документ
Ласкаво просимо до Центру документації OpenIM! Цей центр надає вичерпні посібники та посібники, розроблені, щоб допомогти вам отримати максимальну віддачу від роботи з OpenIM.
## Зміст
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Посібник із внесків і налаштування для розробників
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Інструкції з кодування, політики журналювання та інші інструменти перетворення
------
## Посібник із внесків
Цей розділ надає розробникам докладні вказівки щодо того, як додати код, налаштувати своє середовище та дотримуватися пов’язаних процесів.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Правила та умовності для написання коду в OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Посібник з розробки в OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Ретельно підібрані інструкції.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - робочий процес git у OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Посібник із налаштування та ініціалізації OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Як встановити Docker на вашу машину.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Посібник із налаштування середовища розробки в Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Посібник із виконання деяких типових операцій локально.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Як розгорнути OpenIM офлайн.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Посібник із використання інструменту protoc.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Інструменти та бібліотеки для Go в OpenIM.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Найкращі практики та інструменти для Makefiles.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Найкращі практики та інструменти для створення сценаріїв.
## Методи внеску
У цьому розділі описано різні практики та політики в OpenIM, зокрема код, журнали, версії тощо.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Рекомендації та методи перетворення API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Політика та практика журналювання в OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Процедури та практики CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Конвенції для подання коду в OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Конвенції для подання коду в OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Перелік і опис кодів помилок.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Конвенції та перетворення коду Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Стратегія керування зображеннями OpenIM Docker, що охоплює кілька архітектур і сховищ зображень.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Більш детальні умови для журналювання.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Стратегії іменування та керування для версій OpenIM.
## Для розробників, співавторів і супроводжувачів спільноти
### Розробники та учасники
Якщо ви розробник або бажаєте зробити внесок:
- знайомі з нами [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) і [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md), щоб забезпечити плавний внесок.
- зрозуміти глибше [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md), освоїти практики розробки OpenIM.
### супроводжувач спільноти
Як супроводжувач спільноти:
- Переконайтеся, що внески відповідають стандартам, викладеним у нашій документації.
- Регулярно перевіряйте [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) i [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md), щоб бути в курсі подій.
## Для користувачів
Користувачам слід звернути особливу увагу на:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Це буде необхідно, якщо ви плануєте використовувати образ Docker OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Дізнайтеся про доступні зображення та про те, як вибрати правильний для вашої архітектури.

View File

@@ -1,67 +0,0 @@
# Tài liệu Máy chủ OpenIM
Chào mừng bạn đến với trung tâm tài liệu OpenIM! Trung tâm này cung cấp một loạt các hướng dẫn và hướng dẫn chi tiết được thiết kế để giúp bạn tận dụng tối đa trải nghiệm OpenIM của mình.
## Mục lục
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Hướng dẫn về đóng góp và cấu hình cho các nhà phát triển
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - Quy ước mã hóa, chính sách ghi nhật ký và các công cụ chuyển đổi khác
------
## Đóng góp
Phần này cung cấp cho các nhà phát triển một hướng dẫn chi tiết về cách đóng góp mã, thiết lập môi trường của họ và tuân theo các quy trình liên quan.
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - Quy tắc và quy ước viết mã trong OpenIM.
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - Hướng dẫn về cách thực hiện phát triển trong OpenIM.
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - Hướng dẫn về các hoạt động chọn lọc.
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - Quy trình làm việc git trong OpenIM.
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - Hướng dẫn về thiết lập và khởi tạo OpenIM.
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Cách cài đặt Docker trên máy của bạn.
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Hướng dẫn thiết lập môi trường phát triển trên Linux.
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - Hướng dẫn về cách thực hiện một số hành động phổ biến ở cấp địa phương.
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - Các phương pháp triển khai OpenIM ngoại tuyến.
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - Hướng dẫn sử dụng công cụ protoc.
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - Công cụ và thư viện trong OpenIM cho Go.
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Thực hành tốt nhất và công cụ cho Makefile.
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - Thực hành tốt nhất và công cụ cho kịch bản.
## Chuyển đổi
Phần này giới thiệu các quy ước và chính sách khác nhau trong OpenIM, bao gồm mã, nhật ký, phiên bản và hơn thế nữa.
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - Hướng dẫn và phương pháp chuyển đổi API.
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - Chính sách và quy ước ghi nhật ký trong OpenIM.
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - Quy trình và quy ước cho CI/CD.
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - Quy ước cho các cam kết mã trong OpenIM.
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - Cấu trúc thư mục và quy ước trong OpenIM.
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - Danh sách và mô tả các mã lỗi.
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Quy ước và chuyển đổi cho mã Go.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Chiến lược quản lý hình ảnh Docker của OpenIM, bao gồm nhiều kiến trúc và kho lưu trữ hình ảnh.
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - Quy ước chi tiết hơn về ghi nhật ký.
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - Chiến lược đặt tên và quản lý phiên bản OpenIM.
## Dành cho Nhà phát triển, Người đóng góp và Người duy trì Cộng đồng
### Nhà phát triển & Người đóng góp
Nếu bạn là nhà phát triển hoặc ai đó muốn đóng góp:
- Làm quen với [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) và [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) của chúng tôi để đảm bảo đóng góp trôi chảy.
- Tìm hiểu [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) để nắm bắt các thực hành phát triển trong OpenIM.
### Người duy trì Cộng đồng
Là người duy trì cộng đồng:
- Đảm bảo rằng các đóng góp phù hợp với các tiêu chuẩn được nêu trong tài liệu của chúng tôi.
- Thường xuyên xem lại [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) và [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) để cập nhật thông tin.
## Dành cho Người dùng
Người dùng nên chú ý đặc biệt đến:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - Cần thiết nếu bạn dự định sử dụng hình ảnh Docker của OpenIM.
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - Để hiểu các hình ảnh khác nhau có sẵn và cách chọn hình ảnh phù hợp cho kiến trúc của bạn.

View File

@@ -1,67 +0,0 @@
# OpenIM Server 文档
欢迎来到 OpenIM 文档中心!本中心提供全面的指南和手册,旨在帮助您最大限度地利用 OpenIM 体验。
## 目录
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 为开发者提供的贡献指南和配置
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 编码规范、日志策略和其他转换工具
------
## 贡献指南
本节为开发人员提供了如何贡献代码、设置环境以及遵循相关流程的详细指南。
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - OpenIM 中编写代码的规则和惯例。
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - 关于如何在 OpenIM 内进行开发的指南。
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - 精挑细选的操作指南。
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - OpenIM 中的 git 工作流程。
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - 设置和初始化 OpenIM 的指南。
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - 如何在您的机器上安装 Docker。
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - 在 Linux 上设置开发环境的指南。
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - 关于如何在本地执行某些常见操作的指南。
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - 离线部署 OpenIM 的方法。
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - 使用 protoc 工具的指南。
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - OpenIM 中 Go 的工具和库。
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Makefile 的最佳实践和工具。
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - 脚本的最佳实践和工具。
## 贡献方法
本节介绍 OpenIM 内的各种惯例和政策,包括代码、日志、版本等。
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - API 转换的指南和方法。
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - OpenIM 中的日志策略和惯例。
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD 的程序和惯例。
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIM 中代码提交的惯例。
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - OpenIM 内的目录结构和惯例。
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - 错误代码的列表和描述。
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Go 代码的惯例和转换。
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - OpenIM Docker 镜像的管理策略,涵盖多个架构和镜像仓库。
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - 有关日志的更详细的惯例。
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - OpenIM 版本的命名和管理策略。
## 对于开发者、贡献者和社区维护者
### 开发者和贡献者
如果您是一名开发者或热衷于贡献:
- 熟悉我们的 [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) 和 [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md),以确保顺利贡献。
- 深入了解 [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md),掌握 OpenIM 的开发实践。
### 社区维护者
作为社区维护者:
- 确保贡献符合我们文档中概述的标准。
- 定期查看 [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) 和 [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md),以保持最新状态。
## 对于用户
用户应特别注意:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - 如果您计划使用 OpenIM 的 Docker 镜像,那么这个将会是必须的。
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - 了解可用的镜像以及如何为您的架构选择正确的镜像。

View File

@@ -1,67 +0,0 @@
# OpenIM 伺服器文檔
歡迎來到 OpenIM 文件中心! 該中心提供全面的指南和手冊,旨在幫助您充分利用 OpenIM 體驗。
## 目錄
1. [Contrib](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 開發人員貢獻和配置指南
2. [Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib) - 編碼約定、日誌記錄策略和其他轉換工具
------
## 貢獻
本節為開發人員提供了有關如何貢獻程式碼、設定環境以及遵循相關流程的詳細指南。
- [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) - 在 OpenIM 中編寫程式碼的規則和約定。
- [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) - 有關如何在 OpenIM 中進行開發的指南。
- [Git Cherry Pick](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/gitcherry-pick.md) - 精挑細選操作指南。
- [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) - OpenIM 中的 git 工作流程。
- [Initialization Configurations](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/init-config.md) - 設定和初始化 OpenIM 的指南。
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - 如何在您的電腦上安裝 Docker。
- [Linux Development Environment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/linux-development.md) - Linux 上的開發環境設定指南。
- [Local Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/local-actions.md) - 關於如何在當地進行某些共同行動的指南。
- [Offline Deployment](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/offline-deployment.md) - 離線部署OpenIM的方法。
- [Protoc Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/protoc-tools.md) - 協議工具使用指南。
- [Go Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-go.md) - OpenIM 在 Go 中的工具和函式庫。
- [Makefile Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-makefile.md) - Makefile 的最佳實務和工具。
- [Script Tools](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/util-scripts.md) - 腳本的最佳實踐和工具。
## 轉換
本節介紹 OpenIM 中的各種約定和策略,包括程式碼、日誌、版本等。
- [API Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/api.md) - API 轉換的指南和方法。
- [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) - OpenIM 中的日誌記錄策略和約定。
- [CI/CD Actions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/cicd-actions.md) - CI/CD 的程序和約定。
- [Commit Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/commit.md) - OpenIM 中程式碼提交的約定。
- [Directory Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/directory.md) - OpenIM 中的目錄結構和約定。
- [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) - 錯誤代碼的清單和描述。
- [Go Code Conversions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/go-code.md) - Go 程式碼的約定和轉換。
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - OpenIM Docker 映像的管理策略,跨越多種架構和映像儲存庫。
- [Logging Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/logging.md) - 有關日誌記錄的更詳細約定。
- [Version Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/version.md) - OpenIM 版本的命名與管理策略。
## 對於開發者、貢獻者和社區維護者
### 開發者和貢獻者
如果您是開發人員或熱衷於做出貢獻的人:
- 熟悉我們的 [Code Conventions](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/code-conventions.md) 和 [Git Workflow](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/git-workflow.md) 以確保順利貢獻。
- 深入閱讀 [Development Guide](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/development.md) ,掌握 OpenIM 的開發實務。
### 社區維護者
作為社區維護者:
- 確保貢獻符合我們文件中概述的標準。
- 定期查看 [Logging Policy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/bash-log.md) 和 [Error Codes](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/error-code.md) 以保持更新。
## 對於用戶
使用者應特別注意:
- [Docker Installation](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/install-docker.md) - 如果您打算使用 OpenIM 的 Docker 映像,則這是必要的。
- [Docker Image Strategy](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md) - 了解可用的不同影像以及如何為您的架構選擇正確的影像。

View File

@@ -305,14 +305,13 @@ Feel free to explore the MinIO documentation for more advanced configurations an
This section involves setting up MongoDB, including its port, address, and credentials.
| Parameter | Example Value | Description |
| -------------- | -------------- | ----------------------- |
| MONGO_PORT | "27017" | Port used by MongoDB. |
| MONGO_ADDRESS | [Generated IP] | IP address for MongoDB. |
| MONGO_USERNAME | [User Defined] | Admin Username for MongoDB. |
| MONGO_PASSWORD | [User Defined] | Admin Password for MongoDB. |
| MONGO_OPENIM_USERNAME | [User Defined] | OpenIM Username for MongoDB. |
| MONGO_OPENIM_PASSWORD | [User Defined] | OpenIM Username for MongoDB. |
| MONGO_OPENIM_PASSWORD | [User Defined] | OpenIM Password for MongoDB. |
### 2.8. <a name='TencentCloudCOSConfiguration'></a>Tencent Cloud COS Configuration
@@ -478,6 +477,12 @@ This section involves setting up additional configuration variables for Websocke
| JPNS_MASTER_SECRET | [User Defined] | JPNS Master Secret |
| JPNS_PUSH_URL | [User Defined] | JPNS Push Notification URL |
| JPNS_PUSH_INTENT | [User Defined] | JPNS Push Intent |
| MANAGER_USERID_1 | "openIM123456" | Administrator ID 1 |
| MANAGER_USERID_2 | "openIM654321" | Administrator ID 2 |
| MANAGER_USERID_3 | "openIMAdmin" | Administrator ID 3 |
| NICKNAME_1 | "system1" | Nickname 1 |
| NICKNAME_2 | "system2" | Nickname 2 |
| NICKNAME_3 | "system3" | Nickname 3 |
| IM_ADMIN_USERID | "imAdmin" | IM Administrator ID |
| IM_ADMIN_NAME | "imAdmin" | IM Administrator Nickname |
| MULTILOGIN_POLICY | "1" | Multi-login Policy |

View File

@@ -1,3 +1,5 @@
# OpenIM Offline Deployment Design
## 1. Base Images
@@ -8,7 +10,7 @@ Below are the base images and their versions you'll need:
- [ ] redis:7.0.0
- [ ] mongo:6.0.2
- [ ] bitnami/zookeeper:3.8
- [ ] minio/minio:RELEASE.2024-01-11T07-46-16Z
- [ ] minio/minio:latest
> [!IMPORTANT]
> It is important to note that OpenIM removed mysql components from versions v3.5.0 (release-v3.5) and above, so mysql can be deployed without this requirement or above
@@ -20,10 +22,10 @@ OpenIM:
> [!TIP]
> If you need to install more IM components or monitoring products [images.md](https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/images.md)
- [ ] ghcr.io/openimsdk/openim-web:<version-name>
- [ ] ghcr.io/openimsdk/openim-admin:<version-name>
- [ ] ghcr.io/openimsdk/openim-chat:<version-name>
- [ ] ghcr.io/openimsdk/openim-server:<version-name>
- [ ] ghcr.io/openimsdk/openim-web:latest
- [ ] ghcr.io/openimsdk/openim-admin:latest
- [ ] ghcr.io/openimsdk/openim-chat:latest
- [ ] ghcr.io/openimsdk/openim-server:latest
Monitoring:
@@ -40,9 +42,9 @@ Use the following commands to pull these base images:
docker pull bitnami/kafka:3.5.1
docker pull redis:7.0.0
docker pull mongo:6.0.2
docker pull mariadb:10.6
docker pull mysql:5.7
docker pull bitnami/zookeeper:3.8
docker pull minio/minio:2024-01-11T07-46-16Z
docker pull minio/minio:latest
```
If you need to install more IM components or monitoring products:
@@ -175,4 +177,4 @@ docker compose ps # Verify
- [openimsdk Issue #432](https://github.com/openimsdk/open-im-server/issues/432)
- [Notion Link](https://nsddd.notion.site/435ee747c0bc44048da9300a2d745ad3?pvs=25)
- [openimsdk Issue #474](https://github.com/openimsdk/open-im-server/issues/474)
- [openimsdk Issue #474](https://github.com/openimsdk/open-im-server/issues/474)

20
go.mod
View File

@@ -4,8 +4,8 @@ go 1.19
require (
firebase.google.com/go v3.13.0+incompatible
github.com/OpenIMSDK/protocol v0.0.48
github.com/OpenIMSDK/tools v0.0.31
github.com/OpenIMSDK/protocol v0.0.49
github.com/OpenIMSDK/tools v0.0.28
github.com/bwmarrin/snowflake v0.3.0 // indirect
github.com/dtm-labs/rockscache v0.1.1
github.com/gin-gonic/gin v1.9.1
@@ -18,6 +18,7 @@ require (
github.com/minio/minio-go/v7 v7.0.63
github.com/mitchellh/mapstructure v1.5.0
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
github.com/openimsdk/localcache v0.0.1
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.17.0
github.com/robfig/cron/v3 v3.0.1
@@ -31,7 +32,7 @@ require (
gopkg.in/yaml.v3 v3.0.1
)
require github.com/google/uuid v1.5.0
require github.com/google/uuid v1.3.1
require (
github.com/IBM/sarama v1.41.3
@@ -82,6 +83,7 @@ require (
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
@@ -94,8 +96,8 @@ require (
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd // indirect
github.com/klauspost/compress v1.17.4 // indirect
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/lithammer/shortuuid v3.0.0+incompatible // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
@@ -127,9 +129,9 @@ require (
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/oauth2 v0.13.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/text v0.14.0 // indirect
@@ -141,7 +143,7 @@ require (
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect
gopkg.in/src-d/go-billy.v4 v4.3.2 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gorm.io/gorm v1.25.4 // indirect
gorm.io/gorm v1.23.8 // indirect
stathat.com/c/consistent v1.0.0 // indirect
)
@@ -157,4 +159,4 @@ require (
gopkg.in/ini.v1 v1.67.0 // indirect
)
replace github.com/OpenIMSDK/protocol v0.0.47 => github.com/AndrewZuo01/protocol v0.0.0-20240112093520-fd9c53e27b94
replace github.com/openimsdk/localcache => ./pkg/localcache

35
go.sum
View File

@@ -18,10 +18,10 @@ firebase.google.com/go v3.13.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIw
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/IBM/sarama v1.41.3 h1:MWBEJ12vHC8coMjdEXFq/6ftO6DUZnQlFYcxtOJFa7c=
github.com/IBM/sarama v1.41.3/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ=
github.com/OpenIMSDK/protocol v0.0.48 h1:8MIMjyzJRsruYhVv2ZKArFiOveroaofDOb3dlAdgjsw=
github.com/OpenIMSDK/protocol v0.0.48/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y=
github.com/OpenIMSDK/tools v0.0.31 h1:fSrhcPTvHEMTSyrJZDupe730mL4nuhvSOUP/BaZiHaY=
github.com/OpenIMSDK/tools v0.0.31/go.mod h1:wBfR5CYmEyvxl03QJbTkhz1CluK6J4/lX0lviu8JAjE=
github.com/OpenIMSDK/protocol v0.0.49 h1:wcqJOMBis7f153zNI7V82Fc4WyqA1GanMgXUQgL618k=
github.com/OpenIMSDK/protocol v0.0.49/go.mod h1:F25dFrwrIx3lkNoiuf6FkCfxuwf8L4Z8UIsdTHP/r0Y=
github.com/OpenIMSDK/tools v0.0.27 h1:J/kSRqM+y9U4XK/pQ9RkEB31oQ5BTYD1oA5r1PITPRA=
github.com/OpenIMSDK/tools v0.0.27/go.mod h1:eg+q4A34Qmu73xkY0mt37FHGMCMfC6CtmOnm0kFEGFI=
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
@@ -152,8 +152,8 @@ github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ=
github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
@@ -171,6 +171,8 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@@ -194,6 +196,7 @@ github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
@@ -204,12 +207,12 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -355,8 +358,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
@@ -401,8 +404,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY=
golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0=
@@ -530,8 +533,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw=
gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
gorm.io/gorm v1.23.8 h1:h8sGJ+biDgBA1AD1Ha9gFCx7h8npU7AsLdlkX0n2TpE=
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View File

@@ -105,7 +105,7 @@ func CallbackUserKickOff(ctx context.Context, userID string, platformID int) err
// func callbackUserOnline(operationID, userID string, platformID int, token string, isAppBackground bool, connID
// string) cbApi.CommonCallbackResp {
// callbackResp := cbApi.CommonCallbackResp{OperationID: operationID}
// if !config.Config.Callback.CallbackUserOnline.Enable {
// if !config.Config.Callback.CallbackUserOnline.WithEnable {
// return callbackResp
// }
// callbackUserOnlineReq := cbApi.CallbackUserOnlineReq{
@@ -134,7 +134,7 @@ func CallbackUserKickOff(ctx context.Context, userID string, platformID int) err
//}
//func callbackUserOffline(operationID, userID string, platformID int, connID string) cbApi.CommonCallbackResp {
// callbackResp := cbApi.CommonCallbackResp{OperationID: operationID}
// if !config.Config.Callback.CallbackUserOffline.Enable {
// if !config.Config.Callback.CallbackUserOffline.WithEnable {
// return callbackResp
// }
// callbackOfflineReq := cbApi.CallbackUserOfflineReq{
@@ -161,7 +161,7 @@ func CallbackUserKickOff(ctx context.Context, userID string, platformID int) err
//}
//func callbackUserKickOff(operationID string, userID string, platformID int) cbApi.CommonCallbackResp {
// callbackResp := cbApi.CommonCallbackResp{OperationID: operationID}
// if !config.Config.Callback.CallbackUserKickOff.Enable {
// if !config.Config.Callback.CallbackUserKickOff.WithEnable {
// return callbackResp
// }
// callbackUserKickOffReq := cbApi.CallbackUserKickOffReq{

View File

@@ -25,8 +25,6 @@ import (
"github.com/OpenIMSDK/tools/errs"
"github.com/OpenIMSDK/tools/log"
"github.com/OpenIMSDK/tools/mcontext"
"github.com/OpenIMSDK/tools/utils"
"github.com/openimsdk/open-im-server/v3/pkg/authverify"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
@@ -59,7 +57,7 @@ type Server struct {
rpcPort int
prometheusPort int
LongConnServer LongConnServer
pushTerminal []int
pushTerminal map[int]struct{}
}
func (s *Server) SetLongConnServer(LongConnServer LongConnServer) {
@@ -67,12 +65,15 @@ func (s *Server) SetLongConnServer(LongConnServer LongConnServer) {
}
func NewServer(rpcPort int, proPort int, longConnServer LongConnServer) *Server {
return &Server{
s := &Server{
rpcPort: rpcPort,
prometheusPort: proPort,
LongConnServer: longConnServer,
pushTerminal: []int{constant.IOSPlatformID, constant.AndroidPlatformID},
pushTerminal: make(map[int]struct{}),
}
s.pushTerminal[constant.IOSPlatformID] = struct{}{}
s.pushTerminal[constant.AndroidPlatformID] = struct{}{}
return s
}
func (s *Server) OnlinePushMsg(
@@ -126,13 +127,9 @@ func (s *Server) OnlineBatchPushOneMsg(
panic("implement me")
}
func (s *Server) SuperGroupOnlineBatchPushOneMsg(
ctx context.Context,
req *msggateway.OnlineBatchPushOneMsgReq,
func (s *Server) SuperGroupOnlineBatchPushOneMsg(ctx context.Context, req *msggateway.OnlineBatchPushOneMsgReq,
) (*msggateway.OnlineBatchPushOneMsgResp, error) {
var singleUserResults []*msggateway.SingleMsgToUserResults
for _, v := range req.PushToUserIDs {
var resp []*msggateway.SingleMsgToUserPlatform
results := &msggateway.SingleMsgToUserResults{
@@ -153,23 +150,22 @@ func (s *Server) SuperGroupOnlineBatchPushOneMsg(
}
userPlatform := &msggateway.SingleMsgToUserPlatform{
RecvID: v,
RecvPlatFormID: int32(client.PlatformID),
PlatFormID: int32(client.PlatformID),
}
if !client.IsBackground ||
(client.IsBackground && client.PlatformID != constant.IOSPlatformID) {
err := client.PushMessage(ctx, req.MsgData)
if err != nil {
userPlatform.ResultCode = -2
userPlatform.ResultCode = int64(errs.ErrPushMsgErr.Code())
resp = append(resp, userPlatform)
} else {
if utils.IsContainInt(client.PlatformID, s.pushTerminal) {
if _, ok := s.pushTerminal[client.PlatformID]; ok {
results.OnlinePush = true
resp = append(resp, userPlatform)
}
}
} else {
userPlatform.ResultCode = -3
userPlatform.ResultCode = int64(errs.ErrIOSBackgroundPushErr.Code())
resp = append(resp, userPlatform)
}
}

View File

@@ -16,6 +16,7 @@ package push
import (
"context"
"encoding/json"
"github.com/OpenIMSDK/protocol/constant"
"github.com/OpenIMSDK/protocol/sdkws"
@@ -136,3 +137,14 @@ func callbackBeforeSuperGroupOnlinePush(
}
return nil
}
func GetContent(msg *sdkws.MsgData) string {
if msg.ContentType >= constant.NotificationBegin && msg.ContentType <= constant.NotificationEnd {
var notification sdkws.NotificationElem
if err := json.Unmarshal(msg.Content, &notification); err != nil {
return ""
}
return notification.Detail
} else {
return string(msg.Content)
}
}

View File

@@ -1,32 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package push
type Consumer struct {
pushCh ConsumerHandler
successCount uint64
}
func NewConsumer(pusher *Pusher) *Consumer {
return &Consumer{
pushCh: *NewConsumerHandler(pusher),
}
}
func (c *Consumer) Start() {
// statistics.NewStatistics(&c.successCount, config.Config.ModuleName.PushName, fmt.Sprintf("%d second push to
// msg_gateway count", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval)
go c.pushCh.pushConsumerGroup.RegisterHandleAndConsumer(&c.pushCh)
}

View File

@@ -16,17 +16,16 @@ package dummy
import (
"context"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
)
func NewClient() *Dummy {
func NewDummy() *Dummy {
return &Dummy{}
}
type Dummy struct {
}
func (d *Dummy) Push(ctx context.Context, userIDs []string, title, content string, opts *offlinepush.Opts) error {
func (d *Dummy) Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error {
return nil
}

View File

@@ -16,6 +16,7 @@ package fcm
import (
"context"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
"path/filepath"
firebase "firebase.google.com/go"
@@ -25,7 +26,6 @@ import (
"github.com/OpenIMSDK/protocol/constant"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
)
@@ -39,7 +39,7 @@ type Fcm struct {
cache cache.MsgModel
}
func NewClient(cache cache.MsgModel) *Fcm {
func NewFcm(cache cache.MsgModel) *Fcm {
projectRoot := config.GetProjectRoot()
credentialsFilePath := filepath.Join(projectRoot, "config", config.Config.Push.Fcm.ServiceAccount)
opt := option.WithCredentialsFile(credentialsFilePath)
@@ -56,7 +56,7 @@ func NewClient(cache cache.MsgModel) *Fcm {
return &Fcm{fcmMsgCli: fcmMsgClient, cache: cache}
}
func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string, opts *offlinepush.Opts) error {
func (f *Fcm) Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error {
// accounts->registrationToken
allTokens := make(map[string][]string, 0)
for _, account := range userIDs {

View File

@@ -19,6 +19,7 @@ import (
"crypto/sha256"
"encoding/hex"
"errors"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
"strconv"
"sync"
"time"
@@ -30,7 +31,6 @@ import (
"github.com/OpenIMSDK/tools/mcontext"
"github.com/OpenIMSDK/tools/utils/splitter"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
http2 "github.com/openimsdk/open-im-server/v3/pkg/common/http"
@@ -55,17 +55,17 @@ const (
taskIDTTL = 1000 * 60 * 60 * 24
)
type Client struct {
type GeTui struct {
cache cache.MsgModel
tokenExpireTime int64
taskIDTTL int64
}
func NewClient(cache cache.MsgModel) *Client {
return &Client{cache: cache, tokenExpireTime: tokenExpireTime, taskIDTTL: taskIDTTL}
func NewGeTui(cache cache.MsgModel) *GeTui {
return &GeTui{cache: cache, tokenExpireTime: tokenExpireTime, taskIDTTL: taskIDTTL}
}
func (g *Client) Push(ctx context.Context, userIDs []string, title, content string, opts *offlinepush.Opts) error {
func (g *GeTui) Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error {
token, err := g.cache.GetGetuiToken(ctx)
if err != nil {
if errs.Unwrap(err) == redis.Nil {
@@ -111,7 +111,7 @@ func (g *Client) Push(ctx context.Context, userIDs []string, title, content stri
return err
}
func (g *Client) Auth(ctx context.Context, timeStamp int64) (token string, expireTime int64, err error) {
func (g *GeTui) Auth(ctx context.Context, timeStamp int64) (token string, expireTime int64, err error) {
h := sha256.New()
h.Write(
[]byte(config.Config.Push.GeTui.AppKey + strconv.Itoa(int(timeStamp)) + config.Config.Push.GeTui.MasterSecret),
@@ -131,7 +131,7 @@ func (g *Client) Auth(ctx context.Context, timeStamp int64) (token string, expir
return respAuth.Token, int64(expire), err
}
func (g *Client) GetTaskID(ctx context.Context, token string, pushReq PushReq) (string, error) {
func (g *GeTui) GetTaskID(ctx context.Context, token string, pushReq PushReq) (string, error) {
respTask := TaskResp{}
ttl := int64(1000 * 60 * 5)
pushReq.Settings = &Settings{TTL: &ttl}
@@ -143,7 +143,7 @@ func (g *Client) GetTaskID(ctx context.Context, token string, pushReq PushReq) (
}
// max num is 999.
func (g *Client) batchPush(ctx context.Context, token string, userIDs []string, pushReq PushReq) error {
func (g *GeTui) batchPush(ctx context.Context, token string, userIDs []string, pushReq PushReq) error {
taskID, err := g.GetTaskID(ctx, token, pushReq)
if err != nil {
return err
@@ -152,21 +152,21 @@ func (g *Client) batchPush(ctx context.Context, token string, userIDs []string,
return g.request(ctx, batchPushURL, pushReq, token, nil)
}
func (g *Client) singlePush(ctx context.Context, token, userID string, pushReq PushReq) error {
func (g *GeTui) singlePush(ctx context.Context, token, userID string, pushReq PushReq) error {
operationID := mcontext.GetOperationID(ctx)
pushReq.RequestID = &operationID
pushReq.Audience = &Audience{Alias: []string{userID}}
return g.request(ctx, pushURL, pushReq, token, nil)
}
func (g *Client) request(ctx context.Context, url string, input any, token string, output any) error {
func (g *GeTui) request(ctx context.Context, url string, input any, token string, output any) error {
header := map[string]string{"token": token}
resp := &Resp{}
resp.Data = output
return g.postReturn(ctx, config.Config.Push.GeTui.PushUrl+url, header, input, resp, 3)
}
func (g *Client) postReturn(
func (g *GeTui) postReturn(
ctx context.Context,
url string,
header map[string]string,
@@ -181,7 +181,7 @@ func (g *Client) postReturn(
return output.parseError()
}
func (g *Client) getTokenAndSave2Redis(ctx context.Context) (token string, err error) {
func (g *GeTui) getTokenAndSave2Redis(ctx context.Context) (token string, err error) {
token, _, err = g.Auth(ctx, time.Now().UnixNano()/1e6)
if err != nil {
return
@@ -193,7 +193,7 @@ func (g *Client) getTokenAndSave2Redis(ctx context.Context) (token string, err e
return token, nil
}
func (g *Client) GetTaskIDAndSave2Redis(ctx context.Context, token string, pushReq PushReq) (taskID string, err error) {
func (g *GeTui) GetTaskIDAndSave2Redis(ctx context.Context, token string, pushReq PushReq) (taskID string, err error) {
pushReq.Settings = &Settings{TTL: &g.taskIDTTL}
taskID, err = g.GetTaskID(ctx, token, pushReq)
if err != nil {

View File

@@ -18,8 +18,8 @@ import (
"context"
"encoding/base64"
"fmt"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/jpush/body"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
http2 "github.com/openimsdk/open-im-server/v3/pkg/common/http"
@@ -27,7 +27,7 @@ import (
type JPush struct{}
func NewClient() *JPush {
func NewJPush() *JPush {
return &JPush{}
}
@@ -46,7 +46,7 @@ func (j *JPush) getAuthorization(appKey string, masterSecret string) string {
return Authorization
}
func (j *JPush) Push(ctx context.Context, userIDs []string, title, content string, opts *offlinepush.Opts) error {
func (j *JPush) Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error {
var pf body.Platform
pf.SetAll()
var au body.Audience

View File

@@ -1,37 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package offlinepush
import (
"context"
)
// OfflinePusher Offline Pusher.
type OfflinePusher interface {
Push(ctx context.Context, userIDs []string, title, content string, opts *Opts) error
}
// Opts opts.
type Opts struct {
Signal *Signal
IOSPushSound string
IOSBadgeCount bool
Ex string
}
// Signal message id.
type Signal struct {
ClientMsgID string
}

View File

@@ -0,0 +1,52 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package offlinepush
import (
"context"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/dummy"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/fcm"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/getui"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/jpush"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
)
const (
GETUI = "getui"
FIREBASE = "fcm"
JPUSH = "jpush"
)
// OfflinePusher Offline Pusher.
type OfflinePusher interface {
Push(ctx context.Context, userIDs []string, title, content string, opts *options.Opts) error
}
func NewOfflinePusher(cache cache.MsgModel) OfflinePusher {
var offlinePusher OfflinePusher
switch config.Config.Push.Enable {
case GETUI:
offlinePusher = getui.NewGeTui(cache)
case FIREBASE:
offlinePusher = fcm.NewFcm(cache)
case JPUSH:
offlinePusher = jpush.NewJPush()
default:
offlinePusher = dummy.NewDummy()
}
return offlinePusher
}

View File

@@ -0,0 +1,14 @@
package options
// Opts opts.
type Opts struct {
Signal *Signal
IOSPushSound string
IOSBadgeCount bool
Ex string
}
// Signal message id.
type Signal struct {
ClientMsgID string
}

View File

@@ -0,0 +1,211 @@
package push
import (
"context"
"github.com/OpenIMSDK/protocol/msggateway"
"github.com/OpenIMSDK/protocol/sdkws"
"github.com/OpenIMSDK/tools/discoveryregistry"
"github.com/OpenIMSDK/tools/log"
"github.com/OpenIMSDK/tools/utils"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"golang.org/x/sync/errgroup"
"google.golang.org/grpc"
"os"
"sync"
)
const (
ENVNAME = "ENVS_DISCOVERY"
KUBERNETES = "k8s"
ZOOKEEPER = "zookeeper"
)
type OnlinePusher interface {
GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error)
GetOnlinePushFailedUserIDs(ctx context.Context, msg *sdkws.MsgData, wsResults []*msggateway.SingleMsgToUserResults,
pushToUserIDs *[]string) []string
}
type emptyOnlinePUsher struct{}
func newEmptyOnlinePUsher() *emptyOnlinePUsher {
return &emptyOnlinePUsher{}
}
func (emptyOnlinePUsher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
log.ZWarn(ctx, "emptyOnlinePUsher GetConnsAndOnlinePush", nil)
return nil, nil
}
func (u emptyOnlinePUsher) GetOnlinePushFailedUserIDs(ctx context.Context, msg *sdkws.MsgData,
wsResults []*msggateway.SingleMsgToUserResults, pushToUserIDs *[]string) []string {
log.ZWarn(ctx, "emptyOnlinePUsher GetOnlinePushFailedUserIDs", nil)
return nil
}
func NewOnlinePusher(disCov discoveryregistry.SvcDiscoveryRegistry) OnlinePusher {
var envType string
if value := os.Getenv(ENVNAME); value != "" {
envType = os.Getenv(ENVNAME)
} else {
envType = config.Config.Envs.Discovery
}
switch envType {
case KUBERNETES:
return NewK8sStaticConsistentHash(disCov)
case ZOOKEEPER:
return NewDefaultAllNode(disCov)
default:
return newEmptyOnlinePUsher()
}
}
type DefaultAllNode struct {
disCov discoveryregistry.SvcDiscoveryRegistry
}
func NewDefaultAllNode(disCov discoveryregistry.SvcDiscoveryRegistry) *DefaultAllNode {
return &DefaultAllNode{disCov: disCov}
}
func (d *DefaultAllNode) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
conns, err := d.disCov.GetConns(ctx, config.Config.RpcRegisterName.OpenImMessageGatewayName)
log.ZDebug(ctx, "get gateway conn", "conn length", len(conns))
if err != nil {
return nil, err
}
var (
mu sync.Mutex
wg = errgroup.Group{}
input = &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs}
maxWorkers = config.Config.Push.MaxConcurrentWorkers
)
if maxWorkers < 3 {
maxWorkers = 3
}
wg.SetLimit(maxWorkers)
// Online push message
for _, conn := range conns {
conn := conn // loop var safe
wg.Go(func() error {
msgClient := msggateway.NewMsgGatewayClient(conn)
reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, input)
if err != nil {
return nil
}
log.ZDebug(ctx, "push result", "reply", reply)
if reply != nil && reply.SinglePushResult != nil {
mu.Lock()
wsResults = append(wsResults, reply.SinglePushResult...)
mu.Unlock()
}
return nil
})
}
_ = wg.Wait()
// always return nil
return wsResults, nil
}
func (d *DefaultAllNode) GetOnlinePushFailedUserIDs(_ context.Context, msg *sdkws.MsgData,
wsResults []*msggateway.SingleMsgToUserResults, pushToUserIDs *[]string) []string {
onlineSuccessUserIDs := []string{msg.SendID}
for _, v := range wsResults {
//message sender do not need offline push
if msg.SendID == v.UserID {
continue
}
// mobile online push success
if v.OnlinePush {
onlineSuccessUserIDs = append(onlineSuccessUserIDs, v.UserID)
}
}
return utils.SliceSub(*pushToUserIDs, onlineSuccessUserIDs)
}
type K8sStaticConsistentHash struct {
disCov discoveryregistry.SvcDiscoveryRegistry
}
func NewK8sStaticConsistentHash(disCov discoveryregistry.SvcDiscoveryRegistry) *K8sStaticConsistentHash {
return &K8sStaticConsistentHash{disCov: disCov}
}
func (k *K8sStaticConsistentHash) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData,
pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
var usersHost = make(map[string][]string)
for _, v := range pushToUserIDs {
tHost, err := k.disCov.GetUserIdHashGatewayHost(ctx, v)
if err != nil {
log.ZError(ctx, "get msg gateway hash error", err)
return nil, err
}
tUsers, tbl := usersHost[tHost]
if tbl {
tUsers = append(tUsers, v)
usersHost[tHost] = tUsers
} else {
usersHost[tHost] = []string{v}
}
}
log.ZDebug(ctx, "genUsers send hosts struct:", "usersHost", usersHost)
var usersConns = make(map[*grpc.ClientConn][]string)
for host, userIds := range usersHost {
tconn, _ := k.disCov.GetConn(ctx, host)
usersConns[tconn] = userIds
}
var (
mu sync.Mutex
wg = errgroup.Group{}
maxWorkers = config.Config.Push.MaxConcurrentWorkers
)
if maxWorkers < 3 {
maxWorkers = 3
}
wg.SetLimit(maxWorkers)
for conn, userIds := range usersConns {
tcon := conn
tuserIds := userIds
wg.Go(func() error {
input := &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: tuserIds}
msgClient := msggateway.NewMsgGatewayClient(tcon)
reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, input)
if err != nil {
return nil
}
log.ZDebug(ctx, "push result", "reply", reply)
if reply != nil && reply.SinglePushResult != nil {
mu.Lock()
wsResults = append(wsResults, reply.SinglePushResult...)
mu.Unlock()
}
return nil
})
}
_ = wg.Wait()
return wsResults, nil
}
func (k *K8sStaticConsistentHash) GetOnlinePushFailedUserIDs(_ context.Context, _ *sdkws.MsgData,
wsResults []*msggateway.SingleMsgToUserResults, _ *[]string) []string {
var needOfflinePushUserIDs []string
for _, v := range wsResults {
if !v.OnlinePush {
needOfflinePushUserIDs = append(needOfflinePushUserIDs, v.UserID)
}
}
return needOfflinePushUserIDs
}

51
internal/push/push.go Normal file
View File

@@ -0,0 +1,51 @@
package push
import (
"context"
pbpush "github.com/OpenIMSDK/protocol/push"
"github.com/OpenIMSDK/tools/discoveryregistry"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/controller"
"google.golang.org/grpc"
)
type pushServer struct {
database controller.PushDatabase
disCov discoveryregistry.SvcDiscoveryRegistry
offlinePusher offlinepush.OfflinePusher
pushCh *ConsumerHandler
}
func (p pushServer) PushMsg(ctx context.Context, req *pbpush.PushMsgReq) (*pbpush.PushMsgResp, error) {
//todo reserved Interface
return nil, nil
}
func (p pushServer) DelUserPushToken(ctx context.Context,
req *pbpush.DelUserPushTokenReq) (resp *pbpush.DelUserPushTokenResp, err error) {
if err = p.database.DelFcmToken(ctx, req.UserID, int(req.PlatformID)); err != nil {
return nil, err
}
return &pbpush.DelUserPushTokenResp{}, nil
}
func Start(disCov discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
rdb, err := cache.NewRedis()
if err != nil {
return err
}
cacheModel := cache.NewMsgCacheModel(rdb)
offlinePusher := offlinepush.NewOfflinePusher(cacheModel)
database := controller.NewPushDatabase(cacheModel)
consumer := NewConsumerHandler(offlinePusher, rdb, disCov)
pbpush.RegisterPushMsgServiceServer(server, &pushServer{
database: database,
disCov: disCov,
offlinePusher: offlinePusher,
pushCh: consumer,
})
go consumer.pushConsumerGroup.RegisterHandleAndConsumer(consumer)
return nil
}

View File

@@ -16,6 +16,17 @@ package push
import (
"context"
"encoding/json"
"github.com/OpenIMSDK/protocol/sdkws"
"github.com/OpenIMSDK/tools/discoveryregistry"
"github.com/OpenIMSDK/tools/mcontext"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/options"
"github.com/openimsdk/open-im-server/v3/pkg/common/prommetrics"
"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
"github.com/openimsdk/open-im-server/v3/pkg/rpccache"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
"github.com/redis/go-redis/v9"
"github.com/IBM/sarama"
"google.golang.org/protobuf/proto"
@@ -31,18 +42,31 @@ import (
)
type ConsumerHandler struct {
pushConsumerGroup *kfk.MConsumerGroup
pusher *Pusher
pushConsumerGroup *kfk.MConsumerGroup
offlinePusher offlinepush.OfflinePusher
onlinePusher OnlinePusher
groupLocalCache *rpccache.GroupLocalCache
conversationLocalCache *rpccache.ConversationLocalCache
msgRpcClient rpcclient.MessageRpcClient
conversationRpcClient rpcclient.ConversationRpcClient
groupRpcClient rpcclient.GroupRpcClient
}
func NewConsumerHandler(pusher *Pusher) *ConsumerHandler {
func NewConsumerHandler(offlinePusher offlinepush.OfflinePusher,
rdb redis.UniversalClient, disCov discoveryregistry.SvcDiscoveryRegistry) *ConsumerHandler {
var consumerHandler ConsumerHandler
consumerHandler.pusher = pusher
consumerHandler.pushConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{
KafkaVersion: sarama.V2_0_0_0,
OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false,
}, []string{config.Config.Kafka.MsgToPush.Topic}, config.Config.Kafka.Addr,
config.Config.Kafka.ConsumerGroupID.MsgToPush)
consumerHandler.offlinePusher = offlinePusher
consumerHandler.onlinePusher = NewOnlinePusher(disCov)
consumerHandler.groupRpcClient = rpcclient.NewGroupRpcClient(disCov)
consumerHandler.groupLocalCache = rpccache.NewGroupLocalCache(consumerHandler.groupRpcClient, rdb)
consumerHandler.msgRpcClient = rpcclient.NewMessageRpcClient(disCov)
consumerHandler.conversationRpcClient = rpcclient.NewConversationRpcClient(disCov)
consumerHandler.conversationLocalCache = rpccache.NewConversationLocalCache(consumerHandler.conversationRpcClient, rdb)
return &consumerHandler
}
@@ -65,7 +89,7 @@ func (c *ConsumerHandler) handleMs2PsChat(ctx context.Context, msg []byte) {
var err error
switch msgFromMQ.MsgData.SessionType {
case constant.SuperGroupChatType:
err = c.pusher.Push2SuperGroup(ctx, pbData.MsgData.GroupID, pbData.MsgData)
err = c.Push2SuperGroup(ctx, pbData.MsgData.GroupID, pbData.MsgData)
default:
var pushUserIDList []string
isSenderSync := utils.GetSwitchFromOptions(pbData.MsgData.Options, constant.IsSenderSync)
@@ -74,18 +98,14 @@ func (c *ConsumerHandler) handleMs2PsChat(ctx context.Context, msg []byte) {
} else {
pushUserIDList = append(pushUserIDList, pbData.MsgData.RecvID, pbData.MsgData.SendID)
}
err = c.pusher.Push2User(ctx, pushUserIDList, pbData.MsgData)
err = c.Push2User(ctx, pushUserIDList, pbData.MsgData)
}
if err != nil {
if err == errNoOfflinePusher {
log.ZWarn(ctx, "offline push failed", err, "msg", pbData.String())
} else {
log.ZError(ctx, "push failed", err, "msg", pbData.String())
}
log.ZError(ctx, "push failed", err, "msg", pbData.String())
}
}
func (ConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
func (ConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
func (*ConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
func (*ConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
func (c *ConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
claim sarama.ConsumerGroupClaim,
) error {
@@ -96,3 +116,243 @@ func (c *ConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession,
}
return nil
}
// Push2User Suitable for two types of conversations, one is SingleChatType and the other is NotificationChatType.
func (c *ConsumerHandler) Push2User(ctx context.Context, userIDs []string, msg *sdkws.MsgData) error {
log.ZDebug(ctx, "Get msg from msg_transfer And push msg", "userIDs", userIDs, "msg", msg.String())
if err := callbackOnlinePush(ctx, userIDs, msg); err != nil {
return err
}
wsResults, err := c.onlinePusher.GetConnsAndOnlinePush(ctx, msg, userIDs)
if err != nil {
return err
}
log.ZDebug(ctx, "single and notification push result", "result", wsResults, "msg", msg, "push_to_userID", userIDs)
if !c.shouldPushOffline(ctx, msg) {
return nil
}
for _, v := range wsResults {
//message sender do not need offline push
if msg.SendID == v.UserID {
continue
}
//receiver online push success
if v.OnlinePush {
return nil
}
}
offlinePUshUserID := []string{msg.RecvID}
//receiver offline push
if err = callbackOfflinePush(ctx, offlinePUshUserID, msg, nil); err != nil {
return err
}
err = c.offlinePushMsg(ctx, msg, offlinePUshUserID)
if err != nil {
return err
}
return nil
}
func (c *ConsumerHandler) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws.MsgData) (err error) {
log.ZDebug(ctx, "Get super group msg from msg_transfer and push msg", "msg", msg.String(), "groupID", groupID)
var pushToUserIDs []string
if err = callbackBeforeSuperGroupOnlinePush(ctx, groupID, msg, &pushToUserIDs); err != nil {
return err
}
err = c.groupMessagesHandler(ctx, groupID, &pushToUserIDs, msg)
if err != nil {
return err
}
wsResults, err := c.onlinePusher.GetConnsAndOnlinePush(ctx, msg, pushToUserIDs)
if err != nil {
return err
}
log.ZDebug(ctx, "group push result", "result", wsResults, "msg", msg)
if !c.shouldPushOffline(ctx, msg) {
return nil
}
needOfflinePushUserIDs := c.onlinePusher.GetOnlinePushFailedUserIDs(ctx, msg, wsResults, &pushToUserIDs)
//filter some user, like don not disturb or don't need offline push etc.
needOfflinePushUserIDs, err = c.filterGroupMessageOfflinePush(ctx, groupID, msg, needOfflinePushUserIDs)
if err != nil {
return err
}
// Use offline push messaging
if len(needOfflinePushUserIDs) > 0 {
var offlinePushUserIDs []string
err = callbackOfflinePush(ctx, needOfflinePushUserIDs, msg, &offlinePushUserIDs)
if err != nil {
return err
}
if len(offlinePushUserIDs) > 0 {
needOfflinePushUserIDs = offlinePushUserIDs
}
err = c.offlinePushMsg(ctx, msg, needOfflinePushUserIDs)
if err != nil {
log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg)
return err
}
}
return nil
}
func (c *ConsumerHandler) offlinePushMsg(ctx context.Context, msg *sdkws.MsgData, offlinePushUserIDs []string) error {
title, content, opts, err := c.getOfflinePushInfos(msg)
if err != nil {
return err
}
err = c.offlinePusher.Push(ctx, offlinePushUserIDs, title, content, opts)
if err != nil {
prommetrics.MsgOfflinePushFailedCounter.Inc()
return err
}
return nil
}
func (c *ConsumerHandler) filterGroupMessageOfflinePush(ctx context.Context, groupID string, msg *sdkws.MsgData,
offlinePushUserIDs []string) (userIDs []string, err error) {
//todo local cache Obtain the difference set through local comparison.
needOfflinePushUserIDs, err := c.conversationRpcClient.GetConversationOfflinePushUserIDs(
ctx, utils.GenGroupConversationID(groupID), offlinePushUserIDs)
if err != nil {
return nil, err
}
return needOfflinePushUserIDs, nil
}
func (c *ConsumerHandler) getOfflinePushInfos(msg *sdkws.MsgData) (title, content string, opts *options.Opts, err error) {
type AtTextElem struct {
Text string `json:"text,omitempty"`
AtUserList []string `json:"atUserList,omitempty"`
IsAtSelf bool `json:"isAtSelf"`
}
opts = &options.Opts{Signal: &options.Signal{}}
if msg.OfflinePushInfo != nil {
opts.IOSBadgeCount = msg.OfflinePushInfo.IOSBadgeCount
opts.IOSPushSound = msg.OfflinePushInfo.IOSPushSound
opts.Ex = msg.OfflinePushInfo.Ex
}
if msg.OfflinePushInfo != nil {
title = msg.OfflinePushInfo.Title
content = msg.OfflinePushInfo.Desc
}
if title == "" {
switch msg.ContentType {
case constant.Text:
fallthrough
case constant.Picture:
fallthrough
case constant.Voice:
fallthrough
case constant.Video:
fallthrough
case constant.File:
title = constant.ContentType2PushContent[int64(msg.ContentType)]
case constant.AtText:
ac := AtTextElem{}
_ = utils.JsonStringToStruct(string(msg.Content), &ac)
case constant.SignalingNotification:
title = constant.ContentType2PushContent[constant.SignalMsg]
default:
title = constant.ContentType2PushContent[constant.Common]
}
}
if content == "" {
content = title
}
return
}
func (c *ConsumerHandler) groupMessagesHandler(ctx context.Context, groupID string, pushToUserIDs *[]string, msg *sdkws.MsgData) (err error) {
if len(*pushToUserIDs) == 0 {
*pushToUserIDs, err = c.groupLocalCache.GetGroupMemberIDs(ctx, groupID)
if err != nil {
return err
}
switch msg.ContentType {
case constant.MemberQuitNotification:
var tips sdkws.MemberQuitTips
if unmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
if err = c.DeleteMemberAndSetConversationSeq(ctx, groupID, []string{tips.QuitUser.UserID}); err != nil {
log.ZError(ctx, "MemberQuitNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userID", tips.QuitUser.UserID)
}
*pushToUserIDs = append(*pushToUserIDs, tips.QuitUser.UserID)
case constant.MemberKickedNotification:
var tips sdkws.MemberKickedTips
if unmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
kickedUsers := utils.Slice(tips.KickedUserList, func(e *sdkws.GroupMemberFullInfo) string { return e.UserID })
if err = c.DeleteMemberAndSetConversationSeq(ctx, groupID, kickedUsers); err != nil {
log.ZError(ctx, "MemberKickedNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", kickedUsers)
}
*pushToUserIDs = append(*pushToUserIDs, kickedUsers...)
case constant.GroupDismissedNotification:
if msgprocessor.IsNotification(msgprocessor.GetConversationIDByMsg(msg)) { // 消息先到,通知后到
var tips sdkws.GroupDismissedTips
if unmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
log.ZInfo(ctx, "GroupDismissedNotificationInfo****", "groupID", groupID, "num", len(*pushToUserIDs), "list", pushToUserIDs)
if len(config.Config.Manager.UserID) > 0 {
ctx = mcontext.WithOpUserIDContext(ctx, config.Config.Manager.UserID[0])
}
defer func(groupID string) {
if err = c.groupRpcClient.DismissGroup(ctx, groupID); err != nil {
log.ZError(ctx, "DismissGroup Notification clear members", err, "groupID", groupID)
}
}(groupID)
}
}
}
return err
}
func (c *ConsumerHandler) DeleteMemberAndSetConversationSeq(ctx context.Context, groupID string, userIDs []string) error {
conversationID := msgprocessor.GetConversationIDBySessionType(constant.SuperGroupChatType, groupID)
maxSeq, err := c.msgRpcClient.GetConversationMaxSeq(ctx, conversationID)
if err != nil {
return err
}
return c.conversationRpcClient.SetConversationMaxSeq(ctx, userIDs, conversationID, maxSeq)
}
func unmarshalNotificationElem(bytes []byte, t any) error {
var notification sdkws.NotificationElem
if err := json.Unmarshal(bytes, &notification); err != nil {
return err
}
return json.Unmarshal([]byte(notification.Detail), t)
}
func (c *ConsumerHandler) shouldPushOffline(_ context.Context, msg *sdkws.MsgData) bool {
isOfflinePush := utils.GetSwitchFromOptions(msg.Options, constant.IsOfflinePush)
if !isOfflinePush {
return false
}
if msg.ContentType == constant.SignalingNotification {
return false
}
return true
}

View File

@@ -1,110 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package push
import (
"context"
"sync"
"github.com/OpenIMSDK/tools/utils"
"google.golang.org/grpc"
"github.com/OpenIMSDK/protocol/constant"
pbpush "github.com/OpenIMSDK/protocol/push"
"github.com/OpenIMSDK/tools/discoveryregistry"
"github.com/OpenIMSDK/tools/log"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/controller"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/localcache"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
)
type pushServer struct {
pusher *Pusher
}
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
rdb, err := cache.NewRedis()
if err != nil {
return err
}
cacheModel := cache.NewMsgCacheModel(rdb)
offlinePusher := NewOfflinePusher(cacheModel)
database := controller.NewPushDatabase(cacheModel)
groupRpcClient := rpcclient.NewGroupRpcClient(client)
conversationRpcClient := rpcclient.NewConversationRpcClient(client)
msgRpcClient := rpcclient.NewMessageRpcClient(client)
pusher := NewPusher(
client,
offlinePusher,
database,
localcache.NewGroupLocalCache(&groupRpcClient),
localcache.NewConversationLocalCache(&conversationRpcClient),
&conversationRpcClient,
&groupRpcClient,
&msgRpcClient,
)
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
pbpush.RegisterPushMsgServiceServer(server, &pushServer{
pusher: pusher,
})
}()
go func() {
defer wg.Done()
consumer := NewConsumer(pusher)
consumer.Start()
}()
wg.Wait()
return nil
}
func (r *pushServer) PushMsg(ctx context.Context, pbData *pbpush.PushMsgReq) (resp *pbpush.PushMsgResp, err error) {
switch pbData.MsgData.SessionType {
case constant.SuperGroupChatType:
err = r.pusher.Push2SuperGroup(ctx, pbData.MsgData.GroupID, pbData.MsgData)
default:
var pushUserIDList []string
isSenderSync := utils.GetSwitchFromOptions(pbData.MsgData.Options, constant.IsSenderSync)
if !isSenderSync {
pushUserIDList = append(pushUserIDList, pbData.MsgData.RecvID)
} else {
pushUserIDList = append(pushUserIDList, pbData.MsgData.RecvID, pbData.MsgData.SendID)
}
err = r.pusher.Push2User(ctx, pushUserIDList, pbData.MsgData)
}
if err != nil {
if err != errNoOfflinePusher {
return nil, err
} else {
log.ZWarn(ctx, "offline push failed", err, "msg", pbData.String())
}
}
return &pbpush.PushMsgResp{}, nil
}
func (r *pushServer) DelUserPushToken(
ctx context.Context,
req *pbpush.DelUserPushTokenReq,
) (resp *pbpush.DelUserPushTokenResp, err error) {
if err = r.pusher.database.DelFcmToken(ctx, req.UserID, int(req.PlatformID)); err != nil {
return nil, err
}
return &pbpush.DelUserPushTokenResp{}, nil
}

View File

@@ -1,522 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package push
import (
"context"
"encoding/json"
"errors"
"sync"
"google.golang.org/grpc"
"golang.org/x/sync/errgroup"
"github.com/OpenIMSDK/protocol/constant"
"github.com/OpenIMSDK/protocol/conversation"
"github.com/OpenIMSDK/protocol/msggateway"
"github.com/OpenIMSDK/protocol/sdkws"
"github.com/OpenIMSDK/tools/discoveryregistry"
"github.com/OpenIMSDK/tools/log"
"github.com/OpenIMSDK/tools/mcontext"
"github.com/OpenIMSDK/tools/utils"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/dummy"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/fcm"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/getui"
"github.com/openimsdk/open-im-server/v3/internal/push/offlinepush/jpush"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/controller"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/localcache"
"github.com/openimsdk/open-im-server/v3/pkg/common/prommetrics"
"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
)
type Pusher struct {
database controller.PushDatabase
discov discoveryregistry.SvcDiscoveryRegistry
offlinePusher offlinepush.OfflinePusher
groupLocalCache *localcache.GroupLocalCache
conversationLocalCache *localcache.ConversationLocalCache
msgRpcClient *rpcclient.MessageRpcClient
conversationRpcClient *rpcclient.ConversationRpcClient
groupRpcClient *rpcclient.GroupRpcClient
}
var errNoOfflinePusher = errors.New("no offlinePusher is configured")
func NewPusher(discov discoveryregistry.SvcDiscoveryRegistry, offlinePusher offlinepush.OfflinePusher, database controller.PushDatabase,
groupLocalCache *localcache.GroupLocalCache, conversationLocalCache *localcache.ConversationLocalCache,
conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient, msgRpcClient *rpcclient.MessageRpcClient,
) *Pusher {
return &Pusher{
discov: discov,
database: database,
offlinePusher: offlinePusher,
groupLocalCache: groupLocalCache,
conversationLocalCache: conversationLocalCache,
msgRpcClient: msgRpcClient,
conversationRpcClient: conversationRpcClient,
groupRpcClient: groupRpcClient,
}
}
func NewOfflinePusher(cache cache.MsgModel) offlinepush.OfflinePusher {
var offlinePusher offlinepush.OfflinePusher
switch config.Config.Push.Enable {
case "getui":
offlinePusher = getui.NewClient(cache)
case "fcm":
offlinePusher = fcm.NewClient(cache)
case "jpush":
offlinePusher = jpush.NewClient()
default:
offlinePusher = dummy.NewClient()
}
return offlinePusher
}
func (p *Pusher) DeleteMemberAndSetConversationSeq(ctx context.Context, groupID string, userIDs []string) error {
conevrsationID := msgprocessor.GetConversationIDBySessionType(constant.SuperGroupChatType, groupID)
maxSeq, err := p.msgRpcClient.GetConversationMaxSeq(ctx, conevrsationID)
if err != nil {
return err
}
return p.conversationRpcClient.SetConversationMaxSeq(ctx, userIDs, conevrsationID, maxSeq)
}
func (p *Pusher) Push2User(ctx context.Context, userIDs []string, msg *sdkws.MsgData) error {
log.ZDebug(ctx, "Get msg from msg_transfer And push msg", "userIDs", userIDs, "msg", msg.String())
if err := callbackOnlinePush(ctx, userIDs, msg); err != nil {
return err
}
// push
wsResults, err := p.GetConnsAndOnlinePush(ctx, msg, userIDs)
if err != nil {
return err
}
isOfflinePush := utils.GetSwitchFromOptions(msg.Options, constant.IsOfflinePush)
log.ZDebug(ctx, "push_result", "ws push result", wsResults, "sendData", msg, "isOfflinePush", isOfflinePush, "push_to_userID", userIDs)
if !isOfflinePush {
return nil
}
if len(wsResults) == 0 {
return nil
}
onlinePushSuccUserIDSet := utils.SliceSet(utils.Filter(wsResults, func(e *msggateway.SingleMsgToUserResults) (string, bool) {
return e.UserID, e.OnlinePush && e.UserID != ""
}))
offlinePushUserIDList := utils.Filter(wsResults, func(e *msggateway.SingleMsgToUserResults) (string, bool) {
_, exist := onlinePushSuccUserIDSet[e.UserID]
return e.UserID, !exist && e.UserID != "" && e.UserID != msg.SendID
})
if len(offlinePushUserIDList) > 0 {
if err = callbackOfflinePush(ctx, offlinePushUserIDList, msg, &[]string{}); err != nil {
return err
}
err = p.offlinePushMsg(ctx, msg.SendID, msg, offlinePushUserIDList)
if err != nil {
return err
}
}
return nil
}
func (p *Pusher) UnmarshalNotificationElem(bytes []byte, t any) error {
var notification sdkws.NotificationElem
if err := json.Unmarshal(bytes, &notification); err != nil {
return err
}
return json.Unmarshal([]byte(notification.Detail), t)
}
/*
k8s deployment,offline push group messages function.
*/
func (p *Pusher) k8sOfflinePush2SuperGroup(ctx context.Context, groupID string, msg *sdkws.MsgData, wsResults []*msggateway.SingleMsgToUserResults) error {
var needOfflinePushUserIDs []string
for _, v := range wsResults {
if !v.OnlinePush {
needOfflinePushUserIDs = append(needOfflinePushUserIDs, v.UserID)
}
}
if len(needOfflinePushUserIDs) > 0 {
var offlinePushUserIDs []string
err := callbackOfflinePush(ctx, needOfflinePushUserIDs, msg, &offlinePushUserIDs)
if err != nil {
return err
}
if len(offlinePushUserIDs) > 0 {
needOfflinePushUserIDs = offlinePushUserIDs
}
if msg.ContentType != constant.SignalingNotification {
resp, err := p.conversationRpcClient.Client.GetConversationOfflinePushUserIDs(
ctx,
&conversation.GetConversationOfflinePushUserIDsReq{ConversationID: utils.GenGroupConversationID(groupID), UserIDs: needOfflinePushUserIDs},
)
if err != nil {
return err
}
if len(resp.UserIDs) > 0 {
err = p.offlinePushMsg(ctx, groupID, msg, resp.UserIDs)
if err != nil {
log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg)
return err
}
}
}
}
return nil
}
func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws.MsgData) (err error) {
log.ZDebug(ctx, "Get super group msg from msg_transfer and push msg", "msg", msg.String(), "groupID", groupID)
var pushToUserIDs []string
if err = callbackBeforeSuperGroupOnlinePush(ctx, groupID, msg, &pushToUserIDs); err != nil {
return err
}
if len(pushToUserIDs) == 0 {
pushToUserIDs, err = p.groupLocalCache.GetGroupMemberIDs(ctx, groupID)
if err != nil {
return err
}
switch msg.ContentType {
case constant.MemberQuitNotification:
var tips sdkws.MemberQuitTips
if p.UnmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
defer func(groupID string, userIDs []string) {
if err = p.DeleteMemberAndSetConversationSeq(ctx, groupID, userIDs); err != nil {
log.ZError(ctx, "MemberQuitNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", userIDs)
}
}(groupID, []string{tips.QuitUser.UserID})
pushToUserIDs = append(pushToUserIDs, tips.QuitUser.UserID)
case constant.MemberKickedNotification:
var tips sdkws.MemberKickedTips
if p.UnmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
kickedUsers := utils.Slice(tips.KickedUserList, func(e *sdkws.GroupMemberFullInfo) string { return e.UserID })
defer func(groupID string, userIDs []string) {
if err = p.DeleteMemberAndSetConversationSeq(ctx, groupID, userIDs); err != nil {
log.ZError(ctx, "MemberKickedNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", userIDs)
}
}(groupID, kickedUsers)
pushToUserIDs = append(pushToUserIDs, kickedUsers...)
case constant.GroupDismissedNotification:
if msgprocessor.IsNotification(msgprocessor.GetConversationIDByMsg(msg)) { // 消息先到,通知后到
var tips sdkws.GroupDismissedTips
if p.UnmarshalNotificationElem(msg.Content, &tips) != nil {
return err
}
log.ZInfo(ctx, "GroupDismissedNotificationInfo****", "groupID", groupID, "num", len(pushToUserIDs), "list", pushToUserIDs)
if len(config.Config.Manager.UserID) > 0 {
ctx = mcontext.WithOpUserIDContext(ctx, config.Config.Manager.UserID[0])
}
if len(config.Config.Manager.UserID) == 0 && len(config.Config.IMAdmin.UserID) > 0 {
ctx = mcontext.WithOpUserIDContext(ctx, config.Config.IMAdmin.UserID[0])
}
defer func(groupID string) {
if err = p.groupRpcClient.DismissGroup(ctx, groupID); err != nil {
log.ZError(ctx, "DismissGroup Notification clear members", err, "groupID", groupID)
}
}(groupID)
}
}
}
wsResults, err := p.GetConnsAndOnlinePush(ctx, msg, pushToUserIDs)
if err != nil {
return err
}
log.ZDebug(ctx, "get conn and online push success", "result", wsResults, "msg", msg)
isOfflinePush := utils.GetSwitchFromOptions(msg.Options, constant.IsOfflinePush)
if isOfflinePush && config.Config.Envs.Discovery == "k8s" {
return p.k8sOfflinePush2SuperGroup(ctx, groupID, msg, wsResults)
}
if isOfflinePush && config.Config.Envs.Discovery == "zookeeper" {
var (
onlineSuccessUserIDs = []string{msg.SendID}
webAndPcBackgroundUserIDs []string
)
for _, v := range wsResults {
if v.OnlinePush && v.UserID != msg.SendID {
onlineSuccessUserIDs = append(onlineSuccessUserIDs, v.UserID)
}
if v.OnlinePush {
continue
}
if len(v.Resp) == 0 {
continue
}
for _, singleResult := range v.Resp {
if singleResult.ResultCode != -2 {
continue
}
isPC := constant.PlatformIDToName(int(singleResult.RecvPlatFormID)) == constant.TerminalPC
isWebID := singleResult.RecvPlatFormID == constant.WebPlatformID
if isPC || isWebID {
webAndPcBackgroundUserIDs = append(webAndPcBackgroundUserIDs, v.UserID)
}
}
}
needOfflinePushUserIDs := utils.DifferenceString(onlineSuccessUserIDs, pushToUserIDs)
// Use offline push messaging
if len(needOfflinePushUserIDs) > 0 {
var offlinePushUserIDs []string
err = callbackOfflinePush(ctx, needOfflinePushUserIDs, msg, &offlinePushUserIDs)
if err != nil {
return err
}
if len(offlinePushUserIDs) > 0 {
needOfflinePushUserIDs = offlinePushUserIDs
}
if msg.ContentType != constant.SignalingNotification {
resp, err := p.conversationRpcClient.Client.GetConversationOfflinePushUserIDs(
ctx,
&conversation.GetConversationOfflinePushUserIDsReq{ConversationID: utils.GenGroupConversationID(groupID), UserIDs: needOfflinePushUserIDs},
)
if err != nil {
return err
}
if len(resp.UserIDs) > 0 {
err = p.offlinePushMsg(ctx, groupID, msg, resp.UserIDs)
if err != nil {
log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg)
return err
}
if _, err := p.GetConnsAndOnlinePush(ctx, msg, utils.IntersectString(resp.UserIDs, webAndPcBackgroundUserIDs)); err != nil {
log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg, "userIDs", utils.IntersectString(needOfflinePushUserIDs, webAndPcBackgroundUserIDs))
return err
}
}
}
}
}
return nil
}
func (p *Pusher) k8sOnlinePush(ctx context.Context, msg *sdkws.MsgData, pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
var usersHost = make(map[string][]string)
for _, v := range pushToUserIDs {
tHost, err := p.discov.GetUserIdHashGatewayHost(ctx, v)
if err != nil {
log.ZError(ctx, "get msggateway hash error", err)
return nil, err
}
tUsers, tbl := usersHost[tHost]
if tbl {
tUsers = append(tUsers, v)
usersHost[tHost] = tUsers
} else {
usersHost[tHost] = []string{v}
}
}
log.ZDebug(ctx, "genUsers send hosts struct:", "usersHost", usersHost)
var usersConns = make(map[*grpc.ClientConn][]string)
for host, userIds := range usersHost {
tconn, _ := p.discov.GetConn(ctx, host)
usersConns[tconn] = userIds
}
var (
mu sync.Mutex
wg = errgroup.Group{}
maxWorkers = config.Config.Push.MaxConcurrentWorkers
)
if maxWorkers < 3 {
maxWorkers = 3
}
wg.SetLimit(maxWorkers)
for conn, userIds := range usersConns {
tcon := conn
tuserIds := userIds
wg.Go(func() error {
input := &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: tuserIds}
msgClient := msggateway.NewMsgGatewayClient(tcon)
reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, input)
if err != nil {
return nil
}
log.ZDebug(ctx, "push result", "reply", reply)
if reply != nil && reply.SinglePushResult != nil {
mu.Lock()
wsResults = append(wsResults, reply.SinglePushResult...)
mu.Unlock()
}
return nil
})
}
_ = wg.Wait()
return wsResults, nil
}
func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData, pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) {
if config.Config.Envs.Discovery == "k8s" {
return p.k8sOnlinePush(ctx, msg, pushToUserIDs)
}
conns, err := p.discov.GetConns(ctx, config.Config.RpcRegisterName.OpenImMessageGatewayName)
log.ZDebug(ctx, "get gateway conn", "conn length", len(conns))
if err != nil {
return nil, err
}
var (
mu sync.Mutex
wg = errgroup.Group{}
input = &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs}
maxWorkers = config.Config.Push.MaxConcurrentWorkers
)
if maxWorkers < 3 {
maxWorkers = 3
}
wg.SetLimit(maxWorkers)
// Online push message
for _, conn := range conns {
conn := conn // loop var safe
wg.Go(func() error {
msgClient := msggateway.NewMsgGatewayClient(conn)
reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, input)
if err != nil {
return nil
}
log.ZDebug(ctx, "push result", "reply", reply)
if reply != nil && reply.SinglePushResult != nil {
mu.Lock()
wsResults = append(wsResults, reply.SinglePushResult...)
mu.Unlock()
}
return nil
})
}
_ = wg.Wait()
// always return nil
return wsResults, nil
}
func (p *Pusher) offlinePushMsg(ctx context.Context, conversationID string, msg *sdkws.MsgData, offlinePushUserIDs []string) error {
title, content, opts, err := p.getOfflinePushInfos(conversationID, msg)
if err != nil {
return err
}
err = p.offlinePusher.Push(ctx, offlinePushUserIDs, title, content, opts)
if err != nil {
prommetrics.MsgOfflinePushFailedCounter.Inc()
return err
}
return nil
}
func (p *Pusher) GetOfflinePushOpts(msg *sdkws.MsgData) (opts *offlinepush.Opts, err error) {
opts = &offlinepush.Opts{Signal: &offlinepush.Signal{}}
// if msg.ContentType > constant.SignalingNotificationBegin && msg.ContentType < constant.SignalingNotificationEnd {
// req := &sdkws.SignalReq{}
// if err := proto.Unmarshal(msg.Content, req); err != nil {
// return nil, utils.Wrap(err, "")
// }
// switch req.Payload.(type) {
// case *sdkws.SignalReq_Invite, *sdkws.SignalReq_InviteInGroup:
// opts.Signal = &offlinepush.Signal{ClientMsgID: msg.ClientMsgID}
// }
// }
if msg.OfflinePushInfo != nil {
opts.IOSBadgeCount = msg.OfflinePushInfo.IOSBadgeCount
opts.IOSPushSound = msg.OfflinePushInfo.IOSPushSound
opts.Ex = msg.OfflinePushInfo.Ex
}
return opts, nil
}
func (p *Pusher) getOfflinePushInfos(conversationID string, msg *sdkws.MsgData) (title, content string, opts *offlinepush.Opts, err error) {
if p.offlinePusher == nil {
err = errNoOfflinePusher
return
}
type atContent struct {
Text string `json:"text"`
AtUserList []string `json:"atUserList"`
IsAtSelf bool `json:"isAtSelf"`
}
opts, err = p.GetOfflinePushOpts(msg)
if err != nil {
return
}
if msg.OfflinePushInfo != nil {
title = msg.OfflinePushInfo.Title
content = msg.OfflinePushInfo.Desc
}
if title == "" {
switch msg.ContentType {
case constant.Text:
fallthrough
case constant.Picture:
fallthrough
case constant.Voice:
fallthrough
case constant.Video:
fallthrough
case constant.File:
title = constant.ContentType2PushContent[int64(msg.ContentType)]
case constant.AtText:
ac := atContent{}
_ = utils.JsonStringToStruct(string(msg.Content), &ac)
if utils.IsContain(conversationID, ac.AtUserList) {
title = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common]
} else {
title = constant.ContentType2PushContent[constant.GroupMsg]
}
case constant.SignalingNotification:
title = constant.ContentType2PushContent[constant.SignalMsg]
default:
title = constant.ContentType2PushContent[constant.Common]
}
}
if content == "" {
content = title
}
return
}

View File

@@ -1,32 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package push
import (
"github.com/OpenIMSDK/protocol/constant"
"github.com/OpenIMSDK/protocol/sdkws"
"google.golang.org/protobuf/proto"
)
func GetContent(msg *sdkws.MsgData) string {
if msg.ContentType >= constant.NotificationBegin && msg.ContentType <= constant.NotificationEnd {
var tips sdkws.TipsComm
_ = proto.Unmarshal(msg.Content, &tips)
content := tips.JsonDetail
return content
} else {
return string(msg.Content)
}
}

View File

@@ -16,7 +16,6 @@ package friend
import (
"context"
"github.com/OpenIMSDK/tools/tx"
"github.com/OpenIMSDK/protocol/sdkws"

View File

@@ -44,7 +44,7 @@ func (m *msgServer) GetConversationsHasReadAndMaxSeq(ctx context.Context, req *m
if err != nil {
return nil, err
}
conversations, err := m.Conversation.GetConversations(ctx, req.UserID, conversationIDs)
conversations, err := m.ConversationLocalCache.GetConversations(ctx, req.UserID, conversationIDs)
if err != nil {
return nil, err
}
@@ -107,7 +107,7 @@ func (m *msgServer) MarkMsgsAsRead(
if hasReadSeq > maxSeq {
return nil, errs.ErrArgs.Wrap("hasReadSeq must not be bigger than maxSeq")
}
conversation, err := m.Conversation.GetConversation(ctx, req.UserID, req.ConversationID)
conversation, err := m.ConversationLocalCache.GetConversation(ctx, req.UserID, req.ConversationID)
if err != nil {
return
}
@@ -147,7 +147,7 @@ func (m *msgServer) MarkConversationAsRead(
ctx context.Context,
req *msg.MarkConversationAsReadReq,
) (resp *msg.MarkConversationAsReadResp, err error) {
conversation, err := m.Conversation.GetConversation(ctx, req.UserID, req.ConversationID)
conversation, err := m.ConversationLocalCache.GetConversation(ctx, req.UserID, req.ConversationID)
if err != nil {
return nil, err
}

View File

@@ -47,7 +47,7 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
if err := authverify.CheckAccessV3(ctx, req.UserID); err != nil {
return nil, err
}
user, err := m.User.GetUserInfo(ctx, req.UserID)
user, err := m.UserLocalCache.GetUserInfo(ctx, req.UserID)
if err != nil {
return nil, err
}
@@ -73,12 +73,7 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
}
role = user.AppMangerLevel
case constant.SuperGroupChatType:
members, err := m.Group.GetGroupMemberInfoMap(
ctx,
msgs[0].GroupID,
utils.Distinct([]string{req.UserID, msgs[0].SendID}),
true,
)
members, err := m.GroupLocalCache.GetGroupMemberInfoMap(ctx, msgs[0].GroupID, utils.Distinct([]string{req.UserID, msgs[0].SendID}))
if err != nil {
return nil, err
}
@@ -111,13 +106,6 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
return nil, err
}
revokerUserID := mcontext.GetOpUserID(ctx)
var flag bool
if len(config.Config.Manager.UserID) > 0 {
flag = utils.Contain(revokerUserID, config.Config.Manager.UserID...)
}
if len(config.Config.Manager.UserID) == 0 && len(config.Config.IMAdmin.UserID) > 0 {
flag = utils.Contain(revokerUserID, config.Config.IMAdmin.UserID...)
}
tips := sdkws.RevokeMsgTips{
RevokerUserID: revokerUserID,
ClientMsgID: msgs[0].ClientMsgID,
@@ -125,7 +113,7 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg.
Seq: req.Seq,
SesstionType: msgs[0].SessionType,
ConversationID: req.ConversationID,
IsAdminRevoke: flag,
IsAdminRevoke: utils.Contain(revokerUserID, config.Config.Manager.UserID...),
}
var recvID string
if msgs[0].SessionType == constant.SuperGroupChatType {

View File

@@ -98,7 +98,7 @@ func (m *msgServer) setConversationAtInfo(nctx context.Context, msg *sdkws.MsgDa
}
tagAll := utils.IsContain(constant.AtAllString, msg.AtUserIDList)
if tagAll {
memberUserIDList, err := m.Group.GetGroupMemberIDs(ctx, msg.GroupID)
memberUserIDList, err := m.GroupLocalCache.GetGroupMemberIDs(ctx, msg.GroupID)
if err != nil {
log.ZWarn(ctx, "GetGroupMemberIDs", err)
return
@@ -144,6 +144,7 @@ func (m *msgServer) sendMsgNotification(
}
func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *pbmsg.SendMsgReq) (resp *pbmsg.SendMsgResp, err error) {
log.ZDebug(ctx, "sendMsgSingleChat return")
if err := m.messageVerification(ctx, req); err != nil {
return nil, err
}

View File

@@ -16,6 +16,7 @@ package msg
import (
"context"
"github.com/openimsdk/open-im-server/v3/pkg/rpccache"
"google.golang.org/grpc"
@@ -26,7 +27,6 @@ import (
"github.com/openimsdk/open-im-server/v3/pkg/common/db/cache"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/controller"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/localcache"
"github.com/openimsdk/open-im-server/v3/pkg/common/db/unrelation"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
)
@@ -36,12 +36,11 @@ type (
msgServer struct {
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
MsgDatabase controller.CommonMsgDatabase
Group *rpcclient.GroupRpcClient
User *rpcclient.UserRpcClient
Conversation *rpcclient.ConversationRpcClient
friend *rpcclient.FriendRpcClient
GroupLocalCache *localcache.GroupLocalCache
ConversationLocalCache *localcache.ConversationLocalCache
UserLocalCache *rpccache.UserLocalCache
FriendLocalCache *rpccache.FriendLocalCache
GroupLocalCache *rpccache.GroupLocalCache
ConversationLocalCache *rpccache.ConversationLocalCache
Handlers MessageInterceptorChain
notificationSender *rpcclient.NotificationSender
}
@@ -81,15 +80,15 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e
groupRpcClient := rpcclient.NewGroupRpcClient(client)
friendRpcClient := rpcclient.NewFriendRpcClient(client)
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel)
s := &msgServer{
Conversation: &conversationClient,
User: &userRpcClient,
Group: &groupRpcClient,
MsgDatabase: msgDatabase,
RegisterCenter: client,
GroupLocalCache: localcache.NewGroupLocalCache(&groupRpcClient),
ConversationLocalCache: localcache.NewConversationLocalCache(&conversationClient),
friend: &friendRpcClient,
UserLocalCache: rpccache.NewUserLocalCache(userRpcClient, rdb),
GroupLocalCache: rpccache.NewGroupLocalCache(groupRpcClient, rdb),
ConversationLocalCache: rpccache.NewConversationLocalCache(conversationClient, rdb),
FriendLocalCache: rpccache.NewFriendLocalCache(friendRpcClient, rdb),
}
s.notificationSender = rpcclient.NewNotificationSender(rpcclient.WithLocalSendMsg(s.SendMsg))
s.addInterceptorHandler(MessageHasReadEnabled)

View File

@@ -41,7 +41,7 @@ func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq
var pbUsers []*msg.ActiveUser
if len(users) > 0 {
userIDs := utils.Slice(users, func(e *unrelation.UserCount) string { return e.UserID })
userMap, err := m.User.GetUsersInfoMap(ctx, userIDs)
userMap, err := m.UserLocalCache.GetUsersInfoMap(ctx, userIDs)
if err != nil {
return nil, err
}
@@ -83,7 +83,7 @@ func (m *msgServer) GetActiveGroup(ctx context.Context, req *msg.GetActiveGroupR
var pbgroups []*msg.ActiveGroup
if len(groups) > 0 {
groupIDs := utils.Slice(groups, func(e *unrelation.GroupCount) string { return e.GroupID })
resp, err := m.Group.GetGroupInfos(ctx, groupIDs, false)
resp, err := m.GroupLocalCache.GetGroupInfos(ctx, groupIDs)
if err != nil {
return nil, err
}

View File

@@ -37,7 +37,7 @@ func (m *msgServer) PullMessageBySeqs(
resp.NotificationMsgs = make(map[string]*sdkws.PullMsgs)
for _, seq := range req.SeqRanges {
if !msgprocessor.IsNotification(seq.ConversationID) {
conversation, err := m.Conversation.GetConversation(ctx, req.UserID, seq.ConversationID)
conversation, err := m.ConversationLocalCache.GetConversation(ctx, req.UserID, seq.ConversationID)
if err != nil {
log.ZError(ctx, "GetConversation error", err, "conversationID", seq.ConversationID)
continue
@@ -140,7 +140,7 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
}
}
if len(sendIDs) != 0 {
sendInfos, err := m.User.GetUsersInfo(ctx, sendIDs)
sendInfos, err := m.UserLocalCache.GetUsersInfo(ctx, sendIDs)
if err != nil {
return nil, err
}
@@ -149,7 +149,7 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
}
}
if len(recvIDs) != 0 {
recvInfos, err := m.User.GetUsersInfo(ctx, recvIDs)
recvInfos, err := m.UserLocalCache.GetUsersInfo(ctx, recvIDs)
if err != nil {
return nil, err
}
@@ -158,7 +158,7 @@ func (m *msgServer) SearchMessage(ctx context.Context, req *msg.SearchMessageReq
}
}
if len(groupIDs) != 0 {
groupInfos, err := m.Group.GetGroupInfos(ctx, groupIDs, true)
groupInfos, err := m.GroupLocalCache.GetGroupInfos(ctx, groupIDs)
if err != nil {
return nil, err
}

View File

@@ -16,6 +16,7 @@ package msg
import (
"context"
"github.com/OpenIMSDK/tools/log"
"math/rand"
"strconv"
"time"
@@ -51,17 +52,14 @@ type MessageRevoked struct {
func (m *msgServer) messageVerification(ctx context.Context, data *msg.SendMsgReq) error {
switch data.MsgData.SessionType {
case constant.SingleChatType:
if len(config.Config.Manager.UserID) > 0 && utils.IsContain(data.MsgData.SendID, config.Config.Manager.UserID) {
return nil
}
if utils.IsContain(data.MsgData.SendID, config.Config.IMAdmin.UserID) {
if utils.IsContain(data.MsgData.SendID, config.Config.Manager.UserID) {
return nil
}
if data.MsgData.ContentType <= constant.NotificationEnd &&
data.MsgData.ContentType >= constant.NotificationBegin {
return nil
}
black, err := m.friend.IsBlocked(ctx, data.MsgData.SendID, data.MsgData.RecvID)
black, err := m.FriendLocalCache.IsBlack(ctx, data.MsgData.SendID, data.MsgData.RecvID)
if err != nil {
return err
}
@@ -69,7 +67,7 @@ func (m *msgServer) messageVerification(ctx context.Context, data *msg.SendMsgRe
return errs.ErrBlockedByPeer.Wrap()
}
if *config.Config.MessageVerify.FriendVerify {
friend, err := m.friend.IsFriend(ctx, data.MsgData.SendID, data.MsgData.RecvID)
friend, err := m.FriendLocalCache.IsFriend(ctx, data.MsgData.SendID, data.MsgData.RecvID)
if err != nil {
return err
}
@@ -80,7 +78,7 @@ func (m *msgServer) messageVerification(ctx context.Context, data *msg.SendMsgRe
}
return nil
case constant.SuperGroupChatType:
groupInfo, err := m.Group.GetGroupInfoCache(ctx, data.MsgData.GroupID)
groupInfo, err := m.GroupLocalCache.GetGroupInfo(ctx, data.MsgData.GroupID)
if err != nil {
return err
}
@@ -91,27 +89,24 @@ func (m *msgServer) messageVerification(ctx context.Context, data *msg.SendMsgRe
if groupInfo.GroupType == constant.SuperGroup {
return nil
}
if len(config.Config.Manager.UserID) > 0 && utils.IsContain(data.MsgData.SendID, config.Config.Manager.UserID) {
return nil
}
if utils.IsContain(data.MsgData.SendID, config.Config.IMAdmin.UserID) {
if utils.IsContain(data.MsgData.SendID, config.Config.Manager.UserID) {
return nil
}
if data.MsgData.ContentType <= constant.NotificationEnd &&
data.MsgData.ContentType >= constant.NotificationBegin {
return nil
}
// memberIDs, err := m.GroupLocalCache.GetGroupMemberIDs(ctx, data.MsgData.GroupID)
// if err != nil {
// return err
// }
// if !utils.IsContain(data.MsgData.SendID, memberIDs) {
// return errs.ErrNotInGroupYet.Wrap()
// }
groupMemberInfo, err := m.Group.GetGroupMemberCache(ctx, data.MsgData.GroupID, data.MsgData.SendID)
memberIDs, err := m.GroupLocalCache.GetGroupMemberIDMap(ctx, data.MsgData.GroupID)
if err != nil {
if err == errs.ErrRecordNotFound {
return err
}
if _, ok := memberIDs[data.MsgData.SendID]; !ok {
return errs.ErrNotInGroupYet.Wrap()
}
groupMemberInfo, err := m.GroupLocalCache.GetGroupMember(ctx, data.MsgData.GroupID, data.MsgData.SendID)
if err != nil {
if errs.ErrRecordNotFound.Is(err) {
return errs.ErrNotInGroupYet.Wrap(err.Error())
}
return err
@@ -192,7 +187,8 @@ func (m *msgServer) modifyMessageByUserMessageReceiveOpt(
sessionType int,
pb *msg.SendMsgReq,
) (bool, error) {
opt, err := m.User.GetUserGlobalMsgRecvOpt(ctx, userID)
defer log.ZDebug(ctx, "modifyMessageByUserMessageReceiveOpt return")
opt, err := m.UserLocalCache.GetUserGlobalMsgRecvOpt(ctx, userID)
if err != nil {
return false, err
}
@@ -208,7 +204,7 @@ func (m *msgServer) modifyMessageByUserMessageReceiveOpt(
return true, nil
}
// conversationID := utils.GetConversationIDBySessionType(conversationID, sessionType)
singleOpt, err := m.Conversation.GetSingleConversationRecvMsgOpt(ctx, userID, conversationID)
singleOpt, err := m.ConversationLocalCache.GetSingleConversationRecvMsgOpt(ctx, userID, conversationID)
if errs.ErrRecordNotFound.Is(err) {
return true, nil
} else if err != nil {

View File

@@ -61,6 +61,7 @@ type userServer struct {
RegisterCenter registry.SvcDiscoveryRegistry
}
func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error {
rdb, err := cache.NewRedis()
if err != nil {
@@ -71,6 +72,12 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error {
return err
}
users := make([]*tablerelation.UserModel, 0)
if len(config.Config.Manager.UserID) != len(config.Config.Manager.Nickname) {
return errors.New("len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname)")
}
for k, v := range config.Config.Manager.UserID {
users = append(users, &tablerelation.UserModel{UserID: v, Nickname: config.Config.Manager.Nickname[k], AppMangerLevel: constant.AppAdmin})
}
if len(config.Config.IMAdmin.UserID) != len(config.Config.IMAdmin.Nickname) {
return errors.New("len(config.Config.AppNotificationAdmin.AppManagerUid) != len(config.Config.AppNotificationAdmin.Nickname)")
}

View File

@@ -35,7 +35,7 @@ func Secret() jwt.Keyfunc {
func CheckAccessV3(ctx context.Context, ownerUserID string) (err error) {
opUserID := mcontext.GetOpUserID(ctx)
if len(config.Config.Manager.UserID) > 0 && utils.IsContain(opUserID, config.Config.Manager.UserID) {
if utils.IsContain(opUserID, config.Config.Manager.UserID) {
return nil
}
if utils.IsContain(opUserID, config.Config.IMAdmin.UserID) {
@@ -48,12 +48,11 @@ func CheckAccessV3(ctx context.Context, ownerUserID string) (err error) {
}
func IsAppManagerUid(ctx context.Context) bool {
return (len(config.Config.Manager.UserID) > 0 && utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID)) ||
utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.IMAdmin.UserID)
return utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID) || utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.IMAdmin.UserID)
}
func CheckAdmin(ctx context.Context) error {
if len(config.Config.Manager.UserID) > 0 && utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID) {
if utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID) {
return nil
}
if utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.IMAdmin.UserID) {
@@ -65,7 +64,7 @@ func CheckIMAdmin(ctx context.Context) error {
if utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.IMAdmin.UserID) {
return nil
}
if len(config.Config.Manager.UserID) > 0 && utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID) {
if utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID) {
return nil
}
return errs.ErrNoPermission.Wrap(fmt.Sprintf("user %s is not CheckIMAdmin userID", mcontext.GetOpUserID(ctx)))
@@ -76,7 +75,7 @@ func ParseRedisInterfaceToken(redisToken any) (*tokenverify.Claims, error) {
}
func IsManagerUserID(opUserID string) bool {
return (len(config.Config.Manager.UserID) > 0 && utils.IsContain(opUserID, config.Config.Manager.UserID)) || utils.IsContain(opUserID, config.Config.IMAdmin.UserID)
return utils.IsContain(opUserID, config.Config.Manager.UserID) || utils.IsContain(opUserID, config.Config.IMAdmin.UserID)
}
func WsVerifyToken(token, userID string, platformID int) error {

View File

@@ -0,0 +1,15 @@
package cachekey
const (
BlackIDsKey = "BLACK_IDS:"
IsBlackKey = "IS_BLACK:" // local cache
)
func GetBlackIDsKey(ownerUserID string) string {
return BlackIDsKey + ownerUserID
}
func GetIsBlackIDsKey(possibleBlackUserID, userID string) string {
return IsBlackKey + userID + "-" + possibleBlackUserID
}

View File

@@ -0,0 +1,44 @@
package cachekey
const (
ConversationKey = "CONVERSATION:"
ConversationIDsKey = "CONVERSATION_IDS:"
ConversationIDsHashKey = "CONVERSATION_IDS_HASH:"
ConversationHasReadSeqKey = "CONVERSATION_HAS_READ_SEQ:"
RecvMsgOptKey = "RECV_MSG_OPT:"
SuperGroupRecvMsgNotNotifyUserIDsKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS:"
SuperGroupRecvMsgNotNotifyUserIDsHashKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS_HASH:"
ConversationNotReceiveMessageUserIDsKey = "CONVERSATION_NOT_RECEIVE_MESSAGE_USER_IDS:"
)
func GetConversationKey(ownerUserID, conversationID string) string {
return ConversationKey + ownerUserID + ":" + conversationID
}
func GetConversationIDsKey(ownerUserID string) string {
return ConversationIDsKey + ownerUserID
}
func GetSuperGroupRecvNotNotifyUserIDsKey(groupID string) string {
return SuperGroupRecvMsgNotNotifyUserIDsKey + groupID
}
func GetRecvMsgOptKey(ownerUserID, conversationID string) string {
return RecvMsgOptKey + ownerUserID + ":" + conversationID
}
func GetSuperGroupRecvNotNotifyUserIDsHashKey(groupID string) string {
return SuperGroupRecvMsgNotNotifyUserIDsHashKey + groupID
}
func GetConversationHasReadSeqKey(ownerUserID, conversationID string) string {
return ConversationHasReadSeqKey + ownerUserID + ":" + conversationID
}
func GetConversationNotReceiveMessageUserIDsKey(conversationID string) string {
return ConversationNotReceiveMessageUserIDsKey + conversationID
}
func GetUserConversationIDsHashKey(ownerUserID string) string {
return ConversationIDsHashKey + ownerUserID
}

View File

@@ -0,0 +1,24 @@
package cachekey
const (
FriendIDsKey = "FRIEND_IDS:"
TwoWayFriendsIDsKey = "COMMON_FRIENDS_IDS:"
FriendKey = "FRIEND_INFO:"
IsFriendKey = "IS_FRIEND:" // local cache key
)
func GetFriendIDsKey(ownerUserID string) string {
return FriendIDsKey + ownerUserID
}
func GetTwoWayFriendsIDsKey(ownerUserID string) string {
return TwoWayFriendsIDsKey + ownerUserID
}
func GetFriendKey(ownerUserID, friendUserID string) string {
return FriendKey + ownerUserID + "-" + friendUserID
}
func GetIsFriendKey(possibleFriendUserID, userID string) string {
return IsFriendKey + possibleFriendUserID + "-" + userID
}

View File

@@ -0,0 +1,45 @@
package cachekey
import (
"strconv"
"time"
)
const (
groupExpireTime = time.Second * 60 * 60 * 12
GroupInfoKey = "GROUP_INFO:"
GroupMemberIDsKey = "GROUP_MEMBER_IDS:"
GroupMembersHashKey = "GROUP_MEMBERS_HASH2:"
GroupMemberInfoKey = "GROUP_MEMBER_INFO:"
JoinedGroupsKey = "JOIN_GROUPS_KEY:"
GroupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:"
GroupRoleLevelMemberIDsKey = "GROUP_ROLE_LEVEL_MEMBER_IDS:"
)
func GetGroupInfoKey(groupID string) string {
return GroupInfoKey + groupID
}
func GetJoinedGroupsKey(userID string) string {
return JoinedGroupsKey + userID
}
func GetGroupMembersHashKey(groupID string) string {
return GroupMembersHashKey + groupID
}
func GetGroupMemberIDsKey(groupID string) string {
return GroupMemberIDsKey + groupID
}
func GetGroupMemberInfoKey(groupID, userID string) string {
return GroupMemberInfoKey + groupID + "-" + userID
}
func GetGroupMemberNumKey(groupID string) string {
return GroupMemberNumKey + groupID
}
func GetGroupRoleLevelMemberIDsKey(groupID string, roleLevel int32) string {
return GroupRoleLevelMemberIDsKey + groupID + "-" + strconv.Itoa(int(roleLevel))
}

View File

@@ -0,0 +1,14 @@
package cachekey
const (
UserInfoKey = "USER_INFO:"
UserGlobalRecvMsgOptKey = "USER_GLOBAL_RECV_MSG_OPT_KEY:"
)
func GetUserInfoKey(userID string) string {
return UserInfoKey + userID
}
func GetUserGlobalRecvMsgOptKey(userID string) string {
return UserGlobalRecvMsgOptKey + userID
}

View File

@@ -16,6 +16,7 @@ package config
import (
"bytes"
"time"
"github.com/OpenIMSDK/tools/discoveryregistry"
"gopkg.in/yaml.v3"
@@ -258,6 +259,8 @@ type configStruct struct {
FriendVerify *bool `yaml:"friendVerify"`
} `yaml:"messageVerify"`
LocalCache localCache `yaml:"localCache"`
IOSPush struct {
PushSound string `yaml:"pushSound"`
BadgeCount bool `yaml:"badgeCount"`
@@ -370,6 +373,33 @@ type notification struct {
ConversationSetPrivate NotificationConf `yaml:"conversationSetPrivate"`
}
type LocalCache struct {
Topic string `yaml:"topic"`
SlotNum int `yaml:"slotNum"`
SlotSize int `yaml:"slotSize"`
SuccessExpire int `yaml:"successExpire"` // second
FailedExpire int `yaml:"failedExpire"` // second
}
func (l LocalCache) Failed() time.Duration {
return time.Second * time.Duration(l.FailedExpire)
}
func (l LocalCache) Success() time.Duration {
return time.Second * time.Duration(l.SuccessExpire)
}
func (l LocalCache) Enable() bool {
return l.Topic != "" && l.SlotNum > 0 && l.SlotSize > 0
}
type localCache struct {
User LocalCache `yaml:"user"`
Group LocalCache `yaml:"group"`
Friend LocalCache `yaml:"friend"`
Conversation LocalCache `yaml:"conversation"`
}
func (c *configStruct) GetServiceNames() []string {
return []string{
c.RpcRegisterName.OpenImUserName,

View File

@@ -16,6 +16,8 @@ package config
import (
_ "embed"
"fmt"
"gopkg.in/yaml.v3"
"reflect"
"testing"
@@ -115,3 +117,13 @@ func TestInitConfig(t *testing.T) {
})
}
}
func TestName(t *testing.T) {
Config.LocalCache.Friend.Topic = "friend"
Config.LocalCache.Friend.SlotNum = 500
Config.LocalCache.Friend.SlotSize = 20000
data, _ := yaml.Marshal(&Config)
fmt.Println(string(data))
}

View File

@@ -1 +1 @@
3.5.1
v3.5.0

View File

@@ -16,6 +16,9 @@ package cache
import (
"context"
"github.com/OpenIMSDK/tools/log"
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"time"
"github.com/dtm-labs/rockscache"
@@ -52,11 +55,15 @@ func NewBlackCacheRedis(
options rockscache.Options,
) BlackCache {
rcClient := rockscache.NewClient(rdb, options)
mc := NewMetaCacheRedis(rcClient)
b := config.Config.LocalCache.Friend
log.ZDebug(context.Background(), "black local cache init", "Topic", b.Topic, "SlotNum", b.SlotNum, "SlotSize", b.SlotSize, "enable", b.Enable())
mc.SetTopic(b.Topic)
mc.SetRawRedisClient(rdb)
return &BlackCacheRedis{
expireTime: blackExpireTime,
rcClient: rcClient,
metaCache: NewMetaCacheRedis(rcClient),
metaCache: mc,
blackDB: blackDB,
}
}
@@ -66,12 +73,12 @@ func (b *BlackCacheRedis) NewCache() BlackCache {
expireTime: b.expireTime,
rcClient: b.rcClient,
blackDB: b.blackDB,
metaCache: NewMetaCacheRedis(b.rcClient, b.metaCache.GetPreDelKeys()...),
metaCache: b.Copy(),
}
}
func (b *BlackCacheRedis) getBlackIDsKey(ownerUserID string) string {
return blackIDsKey + ownerUserID
return cachekey.GetBlackIDsKey(ownerUserID)
}
func (b *BlackCacheRedis) GetBlackIDs(ctx context.Context, userID string) (blackIDs []string, err error) {

66
pkg/common/db/cache/config.go vendored Normal file
View File

@@ -0,0 +1,66 @@
package cache
import (
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"strings"
"sync"
)
var (
once sync.Once
subscribe map[string][]string
)
func getPublishKey(topic string, key []string) []string {
if topic == "" || len(key) == 0 {
return nil
}
once.Do(func() {
list := []struct {
Local config.LocalCache
Keys []string
}{
{
Local: config.Config.LocalCache.User,
Keys: []string{cachekey.UserInfoKey, cachekey.UserGlobalRecvMsgOptKey},
},
{
Local: config.Config.LocalCache.Group,
Keys: []string{cachekey.GroupMemberIDsKey, cachekey.GroupInfoKey, cachekey.GroupMemberInfoKey},
},
{
Local: config.Config.LocalCache.Friend,
Keys: []string{cachekey.FriendIDsKey, cachekey.BlackIDsKey},
},
{
Local: config.Config.LocalCache.Conversation,
Keys: []string{cachekey.ConversationIDsKey, cachekey.ConversationKey},
},
}
subscribe = make(map[string][]string)
for _, v := range list {
if v.Local.Enable() {
subscribe[v.Local.Topic] = v.Keys
}
}
})
prefix, ok := subscribe[topic]
if !ok {
return nil
}
res := make([]string, 0, len(key))
for _, k := range key {
var exist bool
for _, p := range prefix {
if strings.HasPrefix(k, p) {
exist = true
break
}
}
if exist {
res = append(res, k)
}
}
return res
}

View File

@@ -17,6 +17,9 @@ package cache
import (
"context"
"errors"
"github.com/OpenIMSDK/tools/log"
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"math/big"
"strings"
"time"
@@ -30,14 +33,14 @@ import (
)
const (
conversationKey = "CONVERSATION:"
conversationIDsKey = "CONVERSATION_IDS:"
conversationIDsHashKey = "CONVERSATION_IDS_HASH:"
conversationHasReadSeqKey = "CONVERSATION_HAS_READ_SEQ:"
recvMsgOptKey = "RECV_MSG_OPT:"
superGroupRecvMsgNotNotifyUserIDsKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS:"
superGroupRecvMsgNotNotifyUserIDsHashKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS_HASH:"
conversationNotReceiveMessageUserIDsKey = "CONVERSATION_NOT_RECEIVE_MESSAGE_USER_IDS:"
//conversationKey = "CONVERSATION:"
//conversationIDsKey = "CONVERSATION_IDS:"
//conversationIDsHashKey = "CONVERSATION_IDS_HASH:"
//conversationHasReadSeqKey = "CONVERSATION_HAS_READ_SEQ:"
//recvMsgOptKey = "RECV_MSG_OPT:"
//superGroupRecvMsgNotNotifyUserIDsKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS:"
//superGroupRecvMsgNotNotifyUserIDsHashKey = "SUPER_GROUP_RECV_MSG_NOT_NOTIFY_USER_IDS_HASH:"
//conversationNotReceiveMessageUserIDsKey = "CONVERSATION_NOT_RECEIVE_MESSAGE_USER_IDS:"
conversationExpireTime = time.Second * 60 * 60 * 12
)
@@ -84,10 +87,14 @@ type ConversationCache interface {
func NewConversationRedis(rdb redis.UniversalClient, opts rockscache.Options, db relationtb.ConversationModelInterface) ConversationCache {
rcClient := rockscache.NewClient(rdb, opts)
mc := NewMetaCacheRedis(rcClient)
c := config.Config.LocalCache.Conversation
log.ZDebug(context.Background(), "black local cache init", "Topic", c.Topic, "SlotNum", c.SlotNum, "SlotSize", c.SlotSize, "enable", c.Enable())
mc.SetTopic(c.Topic)
mc.SetRawRedisClient(rdb)
return &ConversationRedisCache{
rcClient: rcClient,
metaCache: NewMetaCacheRedis(rcClient),
metaCache: mc,
conversationDB: db,
expireTime: conversationExpireTime,
}
@@ -118,38 +125,42 @@ type ConversationRedisCache struct {
func (c *ConversationRedisCache) NewCache() ConversationCache {
return &ConversationRedisCache{
rcClient: c.rcClient,
metaCache: NewMetaCacheRedis(c.rcClient, c.metaCache.GetPreDelKeys()...),
metaCache: c.Copy(),
conversationDB: c.conversationDB,
expireTime: c.expireTime,
}
}
func (c *ConversationRedisCache) getConversationKey(ownerUserID, conversationID string) string {
return conversationKey + ownerUserID + ":" + conversationID
return cachekey.GetConversationKey(ownerUserID, conversationID)
}
func (c *ConversationRedisCache) getConversationIDsKey(ownerUserID string) string {
return conversationIDsKey + ownerUserID
return cachekey.GetConversationIDsKey(ownerUserID)
}
func (c *ConversationRedisCache) getSuperGroupRecvNotNotifyUserIDsKey(groupID string) string {
return superGroupRecvMsgNotNotifyUserIDsKey + groupID
return cachekey.GetSuperGroupRecvNotNotifyUserIDsKey(groupID)
}
func (c *ConversationRedisCache) getRecvMsgOptKey(ownerUserID, conversationID string) string {
return recvMsgOptKey + ownerUserID + ":" + conversationID
return cachekey.GetRecvMsgOptKey(ownerUserID, conversationID)
}
func (c *ConversationRedisCache) getSuperGroupRecvNotNotifyUserIDsHashKey(groupID string) string {
return superGroupRecvMsgNotNotifyUserIDsHashKey + groupID
return cachekey.GetSuperGroupRecvNotNotifyUserIDsHashKey(groupID)
}
func (c *ConversationRedisCache) getConversationHasReadSeqKey(ownerUserID, conversationID string) string {
return conversationHasReadSeqKey + ownerUserID + ":" + conversationID
return cachekey.GetConversationHasReadSeqKey(ownerUserID, conversationID)
}
func (c *ConversationRedisCache) getConversationNotReceiveMessageUserIDsKey(conversationID string) string {
return conversationNotReceiveMessageUserIDsKey + conversationID
return cachekey.GetConversationNotReceiveMessageUserIDsKey(conversationID)
}
func (c *ConversationRedisCache) getUserConversationIDsHashKey(ownerUserID string) string {
return cachekey.GetUserConversationIDsHashKey(ownerUserID)
}
func (c *ConversationRedisCache) GetUserConversationIDs(ctx context.Context, ownerUserID string) ([]string, error) {
@@ -169,10 +180,6 @@ func (c *ConversationRedisCache) DelConversationIDs(userIDs ...string) Conversat
return cache
}
func (c *ConversationRedisCache) getUserConversationIDsHashKey(ownerUserID string) string {
return conversationIDsHashKey + ownerUserID
}
func (c *ConversationRedisCache) GetUserConversationIDsHash(ctx context.Context, ownerUserID string) (hash uint64, err error) {
return getCache(
ctx,

View File

@@ -16,6 +16,9 @@ package cache
import (
"context"
"github.com/OpenIMSDK/tools/log"
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"time"
"github.com/dtm-labs/rockscache"
@@ -27,10 +30,10 @@ import (
)
const (
friendExpireTime = time.Second * 60 * 60 * 12
friendIDsKey = "FRIEND_IDS:"
TwoWayFriendsIDsKey = "COMMON_FRIENDS_IDS:"
friendKey = "FRIEND_INFO:"
friendExpireTime = time.Second * 60 * 60 * 12
//friendIDsKey = "FRIEND_IDS:"
//TwoWayFriendsIDsKey = "COMMON_FRIENDS_IDS:"
//friendKey = "FRIEND_INFO:"
)
// FriendCache is an interface for caching friend-related data.
@@ -60,8 +63,13 @@ type FriendCacheRedis struct {
func NewFriendCacheRedis(rdb redis.UniversalClient, friendDB relationtb.FriendModelInterface,
options rockscache.Options) FriendCache {
rcClient := rockscache.NewClient(rdb, options)
mc := NewMetaCacheRedis(rcClient)
f := config.Config.LocalCache.Friend
log.ZDebug(context.Background(), "friend local cache init", "Topic", f.Topic, "SlotNum", f.SlotNum, "SlotSize", f.SlotSize, "enable", f.Enable())
mc.SetTopic(f.Topic)
mc.SetRawRedisClient(rdb)
return &FriendCacheRedis{
metaCache: NewMetaCacheRedis(rcClient),
metaCache: mc,
friendDB: friendDB,
expireTime: friendExpireTime,
rcClient: rcClient,
@@ -72,7 +80,7 @@ func NewFriendCacheRedis(rdb redis.UniversalClient, friendDB relationtb.FriendMo
func (f *FriendCacheRedis) NewCache() FriendCache {
return &FriendCacheRedis{
rcClient: f.rcClient,
metaCache: NewMetaCacheRedis(f.rcClient, f.metaCache.GetPreDelKeys()...),
metaCache: f.Copy(),
friendDB: f.friendDB,
expireTime: f.expireTime,
}
@@ -80,17 +88,17 @@ func (f *FriendCacheRedis) NewCache() FriendCache {
// getFriendIDsKey returns the key for storing friend IDs in the cache.
func (f *FriendCacheRedis) getFriendIDsKey(ownerUserID string) string {
return friendIDsKey + ownerUserID
return cachekey.GetFriendIDsKey(ownerUserID)
}
// getTwoWayFriendsIDsKey returns the key for storing two-way friend IDs in the cache.
func (f *FriendCacheRedis) getTwoWayFriendsIDsKey(ownerUserID string) string {
return TwoWayFriendsIDsKey + ownerUserID
return cachekey.GetTwoWayFriendsIDsKey(ownerUserID)
}
// getFriendKey returns the key for storing friend info in the cache.
func (f *FriendCacheRedis) getFriendKey(ownerUserID, friendUserID string) string {
return friendKey + ownerUserID + "-" + friendUserID
return cachekey.GetFriendKey(ownerUserID, friendUserID)
}
// GetFriendIDs retrieves friend IDs from the cache or the database if not found.

View File

@@ -17,7 +17,8 @@ package cache
import (
"context"
"fmt"
"strconv"
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"time"
"github.com/OpenIMSDK/protocol/constant"
@@ -34,15 +35,14 @@ import (
)
const (
groupExpireTime = time.Second * 60 * 60 * 12
groupInfoKey = "GROUP_INFO:"
groupMemberIDsKey = "GROUP_MEMBER_IDS:"
groupMembersHashKey = "GROUP_MEMBERS_HASH2:"
groupMemberInfoKey = "GROUP_MEMBER_INFO:"
//groupOwnerInfoKey = "GROUP_OWNER_INFO:".
joinedGroupsKey = "JOIN_GROUPS_KEY:"
groupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:"
groupRoleLevelMemberIDsKey = "GROUP_ROLE_LEVEL_MEMBER_IDS:"
groupExpireTime = time.Second * 60 * 60 * 12
//groupInfoKey = "GROUP_INFO:"
//groupMemberIDsKey = "GROUP_MEMBER_IDS:"
//groupMembersHashKey = "GROUP_MEMBERS_HASH2:"
//groupMemberInfoKey = "GROUP_MEMBER_INFO:"
//joinedGroupsKey = "JOIN_GROUPS_KEY:"
//groupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:"
//groupRoleLevelMemberIDsKey = "GROUP_ROLE_LEVEL_MEMBER_IDS:"
)
type GroupHash interface {
@@ -105,12 +105,16 @@ func NewGroupCacheRedis(
opts rockscache.Options,
) GroupCache {
rcClient := rockscache.NewClient(rdb, opts)
mc := NewMetaCacheRedis(rcClient)
g := config.Config.LocalCache.Group
mc.SetTopic(g.Topic)
log.ZDebug(context.Background(), "group local cache init", "Topic", g.Topic, "SlotNum", g.SlotNum, "SlotSize", g.SlotSize, "enable", g.Enable())
mc.SetRawRedisClient(rdb)
return &GroupCacheRedis{
rcClient: rcClient, expireTime: groupExpireTime,
groupDB: groupDB, groupMemberDB: groupMemberDB, groupRequestDB: groupRequestDB,
groupHash: hashCode,
metaCache: NewMetaCacheRedis(rcClient),
metaCache: mc,
}
}
@@ -121,36 +125,36 @@ func (g *GroupCacheRedis) NewCache() GroupCache {
groupDB: g.groupDB,
groupMemberDB: g.groupMemberDB,
groupRequestDB: g.groupRequestDB,
metaCache: NewMetaCacheRedis(g.rcClient, g.metaCache.GetPreDelKeys()...),
metaCache: g.Copy(),
}
}
func (g *GroupCacheRedis) getGroupInfoKey(groupID string) string {
return groupInfoKey + groupID
return cachekey.GetGroupInfoKey(groupID)
}
func (g *GroupCacheRedis) getJoinedGroupsKey(userID string) string {
return joinedGroupsKey + userID
return cachekey.GetJoinedGroupsKey(userID)
}
func (g *GroupCacheRedis) getGroupMembersHashKey(groupID string) string {
return groupMembersHashKey + groupID
return cachekey.GetGroupMembersHashKey(groupID)
}
func (g *GroupCacheRedis) getGroupMemberIDsKey(groupID string) string {
return groupMemberIDsKey + groupID
return cachekey.GetGroupMemberIDsKey(groupID)
}
func (g *GroupCacheRedis) getGroupMemberInfoKey(groupID, userID string) string {
return groupMemberInfoKey + groupID + "-" + userID
return cachekey.GetGroupMemberInfoKey(groupID, userID)
}
func (g *GroupCacheRedis) getGroupMemberNumKey(groupID string) string {
return groupMemberNumKey + groupID
return cachekey.GetGroupMemberNumKey(groupID)
}
func (g *GroupCacheRedis) getGroupRoleLevelMemberIDsKey(groupID string, roleLevel int32) string {
return groupRoleLevelMemberIDsKey + groupID + "-" + strconv.Itoa(int(roleLevel))
return cachekey.GetGroupRoleLevelMemberIDsKey(groupID, roleLevel)
}
func (g *GroupCacheRedis) GetGroupIndex(group *relationtb.GroupModel, keys []string) (int, error) {

View File

@@ -18,6 +18,7 @@ import (
"context"
"encoding/json"
"errors"
"github.com/redis/go-redis/v9"
"time"
"github.com/OpenIMSDK/tools/mw/specialerror"
@@ -44,6 +45,9 @@ type metaCache interface {
AddKeys(keys ...string)
ClearKeys()
GetPreDelKeys() []string
SetTopic(topic string)
SetRawRedisClient(cli redis.UniversalClient)
Copy() metaCache
}
func NewMetaCacheRedis(rcClient *rockscache.Client, keys ...string) metaCache {
@@ -51,10 +55,36 @@ func NewMetaCacheRedis(rcClient *rockscache.Client, keys ...string) metaCache {
}
type metaCacheRedis struct {
topic string
rcClient *rockscache.Client
keys []string
maxRetryTimes int
retryInterval time.Duration
redisClient redis.UniversalClient
}
func (m *metaCacheRedis) Copy() metaCache {
var keys []string
if len(m.keys) > 0 {
keys = make([]string, 0, len(m.keys)*2)
keys = append(keys, m.keys...)
}
return &metaCacheRedis{
topic: m.topic,
rcClient: m.rcClient,
keys: keys,
maxRetryTimes: m.maxRetryTimes,
retryInterval: m.retryInterval,
redisClient: redisClient,
}
}
func (m *metaCacheRedis) SetTopic(topic string) {
m.topic = topic
}
func (m *metaCacheRedis) SetRawRedisClient(cli redis.UniversalClient) {
m.redisClient = cli
}
func (m *metaCacheRedis) ExecDel(ctx context.Context, distinct ...bool) error {
@@ -62,7 +92,7 @@ func (m *metaCacheRedis) ExecDel(ctx context.Context, distinct ...bool) error {
m.keys = utils.Distinct(m.keys)
}
if len(m.keys) > 0 {
log.ZDebug(ctx, "delete cache", "keys", m.keys)
log.ZDebug(ctx, "delete cache", "topic", m.topic, "keys", m.keys)
for _, key := range m.keys {
for i := 0; i < m.maxRetryTimes; i++ {
if err := m.rcClient.TagAsDeleted(key); err != nil {
@@ -72,31 +102,18 @@ func (m *metaCacheRedis) ExecDel(ctx context.Context, distinct ...bool) error {
}
break
}
//retryTimes := 0
//for {
// m.rcClient.TagAsDeleted()
// if err := m.rcClient.TagAsDeletedBatch2(ctx, []string{key}); err != nil {
// if retryTimes >= m.maxRetryTimes {
// err = errs.ErrInternalServer.Wrap(
// fmt.Sprintf(
// "delete cache error: %v, keys: %v, retry times %d, please check redis server",
// err,
// key,
// retryTimes,
// ),
// )
// log.ZWarn(ctx, "delete cache failed, please handle keys", err, "keys", key)
// return err
// }
// retryTimes++
// } else {
// break
// }
//}
}
if pk := getPublishKey(m.topic, m.keys); len(pk) > 0 {
data, err := json.Marshal(pk)
if err != nil {
log.ZError(ctx, "keys json marshal failed", err, "topic", m.topic, "keys", pk)
} else {
if err := m.redisClient.Publish(ctx, m.topic, string(data)).Err(); err != nil {
log.ZError(ctx, "redis publish cache delete error", err, "topic", m.topic, "keys", pk)
}
}
}
}
return nil
}

View File

@@ -17,6 +17,7 @@ package cache
import (
"context"
"errors"
"github.com/dtm-labs/rockscache"
"strconv"
"time"
@@ -44,12 +45,12 @@ const (
conversationUserMinSeq = "CON_USER_MIN_SEQ:"
hasReadSeq = "HAS_READ_SEQ:"
appleDeviceToken = "DEVICE_TOKEN"
getuiToken = "GETUI_TOKEN"
getuiTaskID = "GETUI_TASK_ID"
signalCache = "SIGNAL_CACHE:"
signalListCache = "SIGNAL_LIST_CACHE:"
FCM_TOKEN = "FCM_TOKEN:"
//appleDeviceToken = "DEVICE_TOKEN"
getuiToken = "GETUI_TOKEN"
getuiTaskID = "GETUI_TASK_ID"
//signalCache = "SIGNAL_CACHE:"
//signalListCache = "SIGNAL_LIST_CACHE:"
FCM_TOKEN = "FCM_TOKEN:"
messageCache = "MESSAGE_CACHE:"
messageDelUserList = "MESSAGE_DEL_USER_LIST:"
@@ -128,7 +129,8 @@ type MsgModel interface {
}
func NewMsgCacheModel(client redis.UniversalClient) MsgModel {
return &msgCache{rdb: client}
rcClient := rockscache.NewClient(client, rockscache.NewDefaultOptions())
return &msgCache{metaCache: NewMetaCacheRedis(rcClient), rdb: client}
}
type msgCache struct {
@@ -148,6 +150,10 @@ func (c *msgCache) getHasReadSeqKey(conversationID string, userID string) string
return hasReadSeq + userID + ":" + conversationID
}
func (c *msgCache) getConversationUserMinSeqKey(conversationID, userID string) string {
return conversationUserMinSeq + conversationID + "u:" + userID
}
func (c *msgCache) setSeq(ctx context.Context, conversationID string, seq int64, getkey func(conversationID string) string) error {
return utils.Wrap1(c.rdb.Set(ctx, getkey(conversationID), seq, 0).Err())
}
@@ -209,10 +215,6 @@ func (c *msgCache) GetMinSeq(ctx context.Context, conversationID string) (int64,
return c.getSeq(ctx, conversationID, c.getMinSeqKey)
}
func (c *msgCache) getConversationUserMinSeqKey(conversationID, userID string) string {
return conversationUserMinSeq + conversationID + "u:" + userID
}
func (c *msgCache) GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, c.getConversationUserMinSeqKey(conversationID, userID)).Int64())
}

View File

@@ -18,6 +18,8 @@ import (
"context"
"encoding/json"
"errors"
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"hash/crc32"
"strconv"
"time"
@@ -36,8 +38,8 @@ import (
)
const (
userExpireTime = time.Second * 60 * 60 * 12
userInfoKey = "USER_INFO:"
userExpireTime = time.Second * 60 * 60 * 12
//userInfoKey = "USER_INFO:"
userGlobalRecvMsgOptKey = "USER_GLOBAL_RECV_MSG_OPT_KEY:"
olineStatusKey = "ONLINE_STATUS:"
userOlineStatusExpireTime = time.Second * 60 * 60 * 24
@@ -72,7 +74,11 @@ func NewUserCacheRedis(
options rockscache.Options,
) UserCache {
rcClient := rockscache.NewClient(rdb, options)
mc := NewMetaCacheRedis(rcClient)
u := config.Config.LocalCache.User
log.ZDebug(context.Background(), "user local cache init", "Topic", u.Topic, "SlotNum", u.SlotNum, "SlotSize", u.SlotSize, "enable", u.Enable())
mc.SetTopic(u.Topic)
mc.SetRawRedisClient(rdb)
return &UserCacheRedis{
rdb: rdb,
metaCache: NewMetaCacheRedis(rcClient),
@@ -85,7 +91,7 @@ func NewUserCacheRedis(
func (u *UserCacheRedis) NewCache() UserCache {
return &UserCacheRedis{
rdb: u.rdb,
metaCache: NewMetaCacheRedis(u.rcClient, u.metaCache.GetPreDelKeys()...),
metaCache: u.Copy(),
userDB: u.userDB,
expireTime: u.expireTime,
rcClient: u.rcClient,
@@ -93,18 +99,17 @@ func (u *UserCacheRedis) NewCache() UserCache {
}
func (u *UserCacheRedis) getUserInfoKey(userID string) string {
return userInfoKey + userID
return cachekey.GetUserInfoKey(userID)
}
func (u *UserCacheRedis) getUserGlobalRecvMsgOptKey(userID string) string {
return userGlobalRecvMsgOptKey + userID
return cachekey.GetUserGlobalRecvMsgOptKey(userID)
}
func (u *UserCacheRedis) GetUserInfo(ctx context.Context, userID string) (userInfo *relationtb.UserModel, err error) {
return getCache(ctx, u.rcClient, u.getUserInfoKey(userID), u.expireTime, func(ctx context.Context) (*relationtb.UserModel, error) {
return u.userDB.Take(ctx, userID)
},
)
})
}
func (u *UserCacheRedis) GetUsersInfo(ctx context.Context, userIDs []string) ([]*relationtb.UserModel, error) {

View File

@@ -1,87 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package localcache
import (
"context"
"sync"
"github.com/OpenIMSDK/protocol/conversation"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
)
type ConversationLocalCache struct {
lock sync.Mutex
superGroupRecvMsgNotNotifyUserIDs map[string]Hash
conversationIDs map[string]Hash
client *rpcclient.ConversationRpcClient
}
type Hash struct {
hash uint64
ids []string
}
func NewConversationLocalCache(client *rpcclient.ConversationRpcClient) *ConversationLocalCache {
return &ConversationLocalCache{
superGroupRecvMsgNotNotifyUserIDs: make(map[string]Hash),
conversationIDs: make(map[string]Hash),
client: client,
}
}
func (g *ConversationLocalCache) GetRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) {
resp, err := g.client.Client.GetRecvMsgNotNotifyUserIDs(ctx, &conversation.GetRecvMsgNotNotifyUserIDsReq{
GroupID: groupID,
})
if err != nil {
return nil, err
}
return resp.UserIDs, nil
}
func (g *ConversationLocalCache) GetConversationIDs(ctx context.Context, userID string) ([]string, error) {
resp, err := g.client.Client.GetUserConversationIDsHash(ctx, &conversation.GetUserConversationIDsHashReq{
OwnerUserID: userID,
})
if err != nil {
return nil, err
}
g.lock.Lock()
hash, ok := g.conversationIDs[userID]
g.lock.Unlock()
if !ok || hash.hash != resp.Hash {
conversationIDsResp, err := g.client.Client.GetConversationIDs(ctx, &conversation.GetConversationIDsReq{
UserID: userID,
})
if err != nil {
return nil, err
}
g.lock.Lock()
defer g.lock.Unlock()
g.conversationIDs[userID] = Hash{
hash: resp.Hash,
ids: conversationIDsResp.ConversationIDs,
}
return conversationIDsResp.ConversationIDs, nil
}
return hash.ids, nil
}

View File

@@ -1,15 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package localcache // import "github.com/openimsdk/open-im-server/v3/pkg/common/db/localcache"

View File

@@ -1,78 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package localcache
import (
"context"
"sync"
"github.com/OpenIMSDK/protocol/group"
"github.com/OpenIMSDK/tools/errs"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
)
type GroupLocalCache struct {
lock sync.Mutex
cache map[string]GroupMemberIDsHash
client *rpcclient.GroupRpcClient
}
type GroupMemberIDsHash struct {
memberListHash uint64
userIDs []string
}
func NewGroupLocalCache(client *rpcclient.GroupRpcClient) *GroupLocalCache {
return &GroupLocalCache{
cache: make(map[string]GroupMemberIDsHash, 0),
client: client,
}
}
func (g *GroupLocalCache) GetGroupMemberIDs(ctx context.Context, groupID string) ([]string, error) {
resp, err := g.client.Client.GetGroupAbstractInfo(ctx, &group.GetGroupAbstractInfoReq{
GroupIDs: []string{groupID},
})
if err != nil {
return nil, err
}
if len(resp.GroupAbstractInfos) < 1 {
return nil, errs.ErrGroupIDNotFound
}
g.lock.Lock()
localHashInfo, ok := g.cache[groupID]
if ok && localHashInfo.memberListHash == resp.GroupAbstractInfos[0].GroupMemberListHash {
g.lock.Unlock()
return localHashInfo.userIDs, nil
}
g.lock.Unlock()
groupMembersResp, err := g.client.Client.GetGroupMemberUserIDs(ctx, &group.GetGroupMemberUserIDsReq{
GroupID: groupID,
})
if err != nil {
return nil, err
}
g.lock.Lock()
defer g.lock.Unlock()
g.cache[groupID] = GroupMemberIDsHash{
memberListHash: resp.GroupAbstractInfos[0].GroupMemberListHash,
userIDs: groupMembersResp.UserIDs,
}
return g.cache[groupID].userIDs, nil
}

View File

@@ -1,15 +0,0 @@
// Copyright © 2023 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package localcache

View File

@@ -114,8 +114,7 @@ func (c *ConversationMgo) GetAllConversationIDs(ctx context.Context) ([]string,
func (c *ConversationMgo) GetAllConversationIDsNumber(ctx context.Context) (int64, error) {
counts, err := mgoutil.Aggregate[int64](ctx, c.coll, []bson.M{
{"$group": bson.M{"_id": "$conversation_id"}},
{"$group": bson.M{"_id": nil, "count": bson.M{"$sum": 1}}},
{"$project": bson.M{"_id": 0}},
{"$project": bson.M{"_id": 0, "conversation_id": "$_id"}},
})
if err != nil {
return 0, err

View File

@@ -1,26 +1,11 @@
// Copyright © 2024 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package direct
import (
"context"
"math/rand"
"strings"
"github.com/OpenIMSDK/tools/log"
"google.golang.org/grpc/resolver"
"math/rand"
"strings"
)
const (

View File

@@ -1,29 +1,13 @@
// Copyright © 2024 OpenIM. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package direct
import (
"context"
"errors"
"fmt"
"github.com/OpenIMSDK/tools/errs"
config2 "github.com/openimsdk/open-im-server/v3/pkg/common/config"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
config2 "github.com/openimsdk/open-im-server/v3/pkg/common/config"
)
type ServiceAddresses map[string][]int

View File

@@ -16,9 +16,8 @@ package discoveryregister
import (
"errors"
"os"
"github.com/openimsdk/open-im-server/v3/pkg/common/discoveryregister/direct"
"os"
"github.com/openimsdk/open-im-server/v3/pkg/common/discoveryregister/kubernetes"
"github.com/openimsdk/open-im-server/v3/pkg/common/discoveryregister/zookeeper"

View File

@@ -0,0 +1,16 @@
package redispubsub
import "github.com/redis/go-redis/v9"
type Publisher struct {
client redis.UniversalClient
channel string
}
func NewPublisher(client redis.UniversalClient, channel string) *Publisher {
return &Publisher{client: client, channel: channel}
}
func (p *Publisher) Publish(message string) error {
return p.client.Publish(ctx, p.channel, message).Err()
}

View File

@@ -0,0 +1,34 @@
package redispubsub
import (
"context"
"github.com/redis/go-redis/v9"
)
var ctx = context.Background()
type Subscriber struct {
client redis.UniversalClient
channel string
}
func NewSubscriber(client redis.UniversalClient, channel string) *Subscriber {
return &Subscriber{client: client, channel: channel}
}
func (s *Subscriber) OnMessage(ctx context.Context, callback func(string)) error {
messageChannel := s.client.Subscribe(ctx, s.channel).Channel()
go func() {
for {
select {
case <-ctx.Done():
return
case msg := <-messageChannel:
callback(msg.Payload)
}
}
}()
return nil
}

112
pkg/localcache/cache.go Normal file
View File

@@ -0,0 +1,112 @@
package localcache
import (
"context"
"github.com/openimsdk/localcache/link"
"github.com/openimsdk/localcache/lru"
"hash/fnv"
"unsafe"
)
type Cache[V any] interface {
Get(ctx context.Context, key string, fetch func(ctx context.Context) (V, error)) (V, error)
GetLink(ctx context.Context, key string, fetch func(ctx context.Context) (V, error), link ...string) (V, error)
Del(ctx context.Context, key ...string)
DelLocal(ctx context.Context, key ...string)
Stop()
}
func New[V any](opts ...Option) Cache[V] {
opt := defaultOption()
for _, o := range opts {
o(opt)
}
c := cache[V]{opt: opt}
if opt.localSlotNum > 0 && opt.localSlotSize > 0 {
createSimpleLRU := func() lru.LRU[string, V] {
if opt.expirationEvict {
return lru.NewExpirationLRU[string, V](opt.localSlotSize, opt.localSuccessTTL, opt.localFailedTTL, opt.target, c.onEvict)
} else {
return lru.NewLayLRU[string, V](opt.localSlotSize, opt.localSuccessTTL, opt.localFailedTTL, opt.target, c.onEvict)
}
}
if opt.localSlotNum == 1 {
c.local = createSimpleLRU()
} else {
c.local = lru.NewSlotLRU[string, V](opt.localSlotNum, func(key string) uint64 {
h := fnv.New64a()
h.Write(*(*[]byte)(unsafe.Pointer(&key)))
return h.Sum64()
}, createSimpleLRU)
}
if opt.linkSlotNum > 0 {
c.link = link.New(opt.linkSlotNum)
}
}
return &c
}
type cache[V any] struct {
opt *option
link link.Link
local lru.LRU[string, V]
}
func (c *cache[V]) onEvict(key string, value V) {
if c.link != nil {
lks := c.link.Del(key)
for k := range lks {
if key != k { // prevent deadlock
c.local.Del(k)
}
}
}
}
func (c *cache[V]) del(key ...string) {
if c.local == nil {
return
}
for _, k := range key {
c.local.Del(k)
if c.link != nil {
lks := c.link.Del(k)
for k := range lks {
c.local.Del(k)
}
}
}
}
func (c *cache[V]) Get(ctx context.Context, key string, fetch func(ctx context.Context) (V, error)) (V, error) {
return c.GetLink(ctx, key, fetch)
}
func (c *cache[V]) GetLink(ctx context.Context, key string, fetch func(ctx context.Context) (V, error), link ...string) (V, error) {
if c.local != nil {
return c.local.Get(key, func() (V, error) {
if len(link) > 0 {
c.link.Link(key, link...)
}
return fetch(ctx)
})
} else {
return fetch(ctx)
}
}
func (c *cache[V]) Del(ctx context.Context, key ...string) {
for _, fn := range c.opt.delFn {
fn(ctx, key...)
}
c.del(key...)
}
func (c *cache[V]) DelLocal(ctx context.Context, key ...string) {
c.del(key...)
}
func (c *cache[V]) Stop() {
c.local.Stop()
}

View File

@@ -0,0 +1,79 @@
package localcache
import (
"context"
"fmt"
"math/rand"
"sync"
"sync/atomic"
"testing"
"time"
)
func TestName(t *testing.T) {
c := New[string](WithExpirationEvict())
//c := New[string]()
ctx := context.Background()
const (
num = 10000
tNum = 10000
kNum = 100000
pNum = 100
)
getKey := func(v uint64) string {
return fmt.Sprintf("key_%d", v%kNum)
}
start := time.Now()
t.Log("start", start)
var (
get atomic.Int64
del atomic.Int64
)
incrGet := func() {
if v := get.Add(1); v%pNum == 0 {
//t.Log("#get count", v/pNum)
}
}
incrDel := func() {
if v := del.Add(1); v%pNum == 0 {
//t.Log("@del count", v/pNum)
}
}
var wg sync.WaitGroup
for i := 0; i < tNum; i++ {
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < num; i++ {
c.Get(ctx, getKey(rand.Uint64()), func(ctx context.Context) (string, error) {
return fmt.Sprintf("index_%d", i), nil
})
incrGet()
}
}()
go func() {
defer wg.Done()
time.Sleep(time.Second / 10)
for i := 0; i < num; i++ {
c.Del(ctx, getKey(rand.Uint64()))
incrDel()
}
}()
}
wg.Wait()
end := time.Now()
t.Log("end", end)
t.Log("time", end.Sub(start))
t.Log("get", get.Load())
t.Log("del", del.Load())
// 137.35s
}

5
pkg/localcache/go.mod Normal file
View File

@@ -0,0 +1,5 @@
module github.com/openimsdk/localcache
go 1.19
require github.com/hashicorp/golang-lru/v2 v2.0.7

109
pkg/localcache/link/link.go Normal file
View File

@@ -0,0 +1,109 @@
package link
import (
"hash/fnv"
"sync"
"unsafe"
)
type Link interface {
Link(key string, link ...string)
Del(key string) map[string]struct{}
}
func newLinkKey() *linkKey {
return &linkKey{
data: make(map[string]map[string]struct{}),
}
}
type linkKey struct {
lock sync.Mutex
data map[string]map[string]struct{}
}
func (x *linkKey) link(key string, link ...string) {
x.lock.Lock()
defer x.lock.Unlock()
v, ok := x.data[key]
if !ok {
v = make(map[string]struct{})
x.data[key] = v
}
for _, k := range link {
v[k] = struct{}{}
}
}
func (x *linkKey) del(key string) map[string]struct{} {
x.lock.Lock()
defer x.lock.Unlock()
ks, ok := x.data[key]
if !ok {
return nil
}
delete(x.data, key)
return ks
}
func New(n int) Link {
if n <= 0 {
panic("must be greater than 0")
}
slots := make([]*linkKey, n)
for i := 0; i < len(slots); i++ {
slots[i] = newLinkKey()
}
return &slot{
n: uint64(n),
slots: slots,
}
}
type slot struct {
n uint64
slots []*linkKey
}
func (x *slot) index(s string) uint64 {
h := fnv.New64a()
_, _ = h.Write(*(*[]byte)(unsafe.Pointer(&s)))
return h.Sum64() % x.n
}
func (x *slot) Link(key string, link ...string) {
if len(link) == 0 {
return
}
mk := key
lks := make([]string, len(link))
for i, k := range link {
lks[i] = k
}
x.slots[x.index(mk)].link(mk, lks...)
for _, lk := range lks {
x.slots[x.index(lk)].link(lk, mk)
}
}
func (x *slot) Del(key string) map[string]struct{} {
return x.delKey(key)
}
func (x *slot) delKey(k string) map[string]struct{} {
del := make(map[string]struct{})
stack := []string{k}
for len(stack) > 0 {
curr := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if _, ok := del[curr]; ok {
continue
}
del[curr] = struct{}{}
childKeys := x.slots[x.index(curr)].del(curr)
for ck := range childKeys {
stack = append(stack, ck)
}
}
return del
}

View File

@@ -0,0 +1,20 @@
package link
import (
"testing"
)
func TestName(t *testing.T) {
v := New(1)
//v.Link("a:1", "b:1", "c:1", "d:1")
v.Link("a:1", "b:1", "c:1")
v.Link("z:1", "b:1")
//v.DelKey("a:1")
v.Del("z:1")
t.Log(v)
}

20
pkg/localcache/lru/lru.go Normal file
View File

@@ -0,0 +1,20 @@
package lru
import "github.com/hashicorp/golang-lru/v2/simplelru"
type EvictCallback[K comparable, V any] simplelru.EvictCallback[K, V]
type LRU[K comparable, V any] interface {
Get(key K, fetch func() (V, error)) (V, error)
Del(key K) bool
Stop()
}
type Target interface {
IncrGetHit()
IncrGetSuccess()
IncrGetFailed()
IncrDelHit()
IncrDelNotFound()
}

View File

@@ -0,0 +1,78 @@
package lru
import (
"github.com/hashicorp/golang-lru/v2/expirable"
"sync"
"time"
)
func NewExpirationLRU[K comparable, V any](size int, successTTL, failedTTL time.Duration, target Target, onEvict EvictCallback[K, V]) LRU[K, V] {
var cb expirable.EvictCallback[K, *expirationLruItem[V]]
if onEvict != nil {
cb = func(key K, value *expirationLruItem[V]) {
onEvict(key, value.value)
}
}
core := expirable.NewLRU[K, *expirationLruItem[V]](size, cb, successTTL)
return &ExpirationLRU[K, V]{
core: core,
successTTL: successTTL,
failedTTL: failedTTL,
target: target,
}
}
type expirationLruItem[V any] struct {
lock sync.RWMutex
err error
value V
}
type ExpirationLRU[K comparable, V any] struct {
lock sync.Mutex
core *expirable.LRU[K, *expirationLruItem[V]]
successTTL time.Duration
failedTTL time.Duration
target Target
}
func (x *ExpirationLRU[K, V]) Get(key K, fetch func() (V, error)) (V, error) {
x.lock.Lock()
v, ok := x.core.Get(key)
if ok {
x.lock.Unlock()
x.target.IncrGetSuccess()
v.lock.RLock()
defer v.lock.RUnlock()
return v.value, v.err
} else {
v = &expirationLruItem[V]{}
x.core.Add(key, v)
v.lock.Lock()
x.lock.Unlock()
defer v.lock.Unlock()
v.value, v.err = fetch()
if v.err == nil {
x.target.IncrGetSuccess()
} else {
x.target.IncrGetFailed()
x.core.Remove(key)
}
return v.value, v.err
}
}
func (x *ExpirationLRU[K, V]) Del(key K) bool {
x.lock.Lock()
ok := x.core.Remove(key)
x.lock.Unlock()
if ok {
x.target.IncrDelHit()
} else {
x.target.IncrDelNotFound()
}
return ok
}
func (x *ExpirationLRU[K, V]) Stop() {
}

View File

@@ -0,0 +1,90 @@
package lru
import (
"github.com/hashicorp/golang-lru/v2/simplelru"
"sync"
"time"
)
type layLruItem[V any] struct {
lock sync.Mutex
expires int64
err error
value V
}
func NewLayLRU[K comparable, V any](size int, successTTL, failedTTL time.Duration, target Target, onEvict EvictCallback[K, V]) *LayLRU[K, V] {
var cb simplelru.EvictCallback[K, *layLruItem[V]]
if onEvict != nil {
cb = func(key K, value *layLruItem[V]) {
onEvict(key, value.value)
}
}
core, err := simplelru.NewLRU[K, *layLruItem[V]](size, cb)
if err != nil {
panic(err)
}
return &LayLRU[K, V]{
core: core,
successTTL: successTTL,
failedTTL: failedTTL,
target: target,
}
}
type LayLRU[K comparable, V any] struct {
lock sync.Mutex
core *simplelru.LRU[K, *layLruItem[V]]
successTTL time.Duration
failedTTL time.Duration
target Target
}
func (x *LayLRU[K, V]) Get(key K, fetch func() (V, error)) (V, error) {
x.lock.Lock()
v, ok := x.core.Get(key)
if ok {
x.lock.Unlock()
v.lock.Lock()
expires, value, err := v.expires, v.value, v.err
if expires != 0 && expires > time.Now().UnixMilli() {
v.lock.Unlock()
x.target.IncrGetHit()
return value, err
}
} else {
v = &layLruItem[V]{}
x.core.Add(key, v)
v.lock.Lock()
x.lock.Unlock()
}
defer v.lock.Unlock()
if v.expires > time.Now().UnixMilli() {
return v.value, v.err
}
v.value, v.err = fetch()
if v.err == nil {
v.expires = time.Now().Add(x.successTTL).UnixMilli()
x.target.IncrGetSuccess()
} else {
v.expires = time.Now().Add(x.failedTTL).UnixMilli()
x.target.IncrGetFailed()
}
return v.value, v.err
}
func (x *LayLRU[K, V]) Del(key K) bool {
x.lock.Lock()
ok := x.core.Remove(key)
x.lock.Unlock()
if ok {
x.target.IncrDelHit()
} else {
x.target.IncrDelNotFound()
}
return ok
}
func (x *LayLRU[K, V]) Stop() {
}

View File

@@ -0,0 +1,104 @@
package lru
import (
"fmt"
"hash/fnv"
"sync"
"sync/atomic"
"testing"
"time"
"unsafe"
)
type cacheTarget struct {
getHit int64
getSuccess int64
getFailed int64
delHit int64
delNotFound int64
}
func (r *cacheTarget) IncrGetHit() {
atomic.AddInt64(&r.getHit, 1)
}
func (r *cacheTarget) IncrGetSuccess() {
atomic.AddInt64(&r.getSuccess, 1)
}
func (r *cacheTarget) IncrGetFailed() {
atomic.AddInt64(&r.getFailed, 1)
}
func (r *cacheTarget) IncrDelHit() {
atomic.AddInt64(&r.delHit, 1)
}
func (r *cacheTarget) IncrDelNotFound() {
atomic.AddInt64(&r.delNotFound, 1)
}
func (r *cacheTarget) String() string {
return fmt.Sprintf("getHit: %d, getSuccess: %d, getFailed: %d, delHit: %d, delNotFound: %d", r.getHit, r.getSuccess, r.getFailed, r.delHit, r.delNotFound)
}
func TestName(t *testing.T) {
target := &cacheTarget{}
l := NewSlotLRU[string, string](100, func(k string) uint64 {
h := fnv.New64a()
h.Write(*(*[]byte)(unsafe.Pointer(&k)))
return h.Sum64()
}, func() LRU[string, string] {
return NewExpirationLRU[string, string](100, time.Second*60, time.Second, target, nil)
})
//l := NewInertiaLRU[string, string](1000, time.Second*20, time.Second*5, target)
fn := func(key string, n int, fetch func() (string, error)) {
for i := 0; i < n; i++ {
//v, err := l.Get(key, fetch)
//if err == nil {
// t.Log("key", key, "value", v)
//} else {
// t.Error("key", key, err)
//}
v, err := l.Get(key, fetch)
//time.Sleep(time.Second / 100)
func(v ...any) {}(v, err)
}
}
tmp := make(map[string]struct{})
var wg sync.WaitGroup
for i := 0; i < 10000; i++ {
wg.Add(1)
key := fmt.Sprintf("key_%d", i%200)
tmp[key] = struct{}{}
go func() {
defer wg.Done()
//t.Log(key)
fn(key, 10000, func() (string, error) {
//time.Sleep(time.Second * 3)
//t.Log(time.Now(), "key", key, "fetch")
//if rand.Uint32()%5 == 0 {
// return "value_" + key, nil
//}
//return "", errors.New("rand error")
return "value_" + key, nil
})
}()
//wg.Add(1)
//go func() {
// defer wg.Done()
// for i := 0; i < 10; i++ {
// l.Del(key)
// time.Sleep(time.Second / 3)
// }
//}()
}
wg.Wait()
t.Log(len(tmp))
t.Log(target.String())
}

View File

@@ -0,0 +1,37 @@
package lru
func NewSlotLRU[K comparable, V any](slotNum int, hash func(K) uint64, create func() LRU[K, V]) LRU[K, V] {
x := &slotLRU[K, V]{
n: uint64(slotNum),
slots: make([]LRU[K, V], slotNum),
hash: hash,
}
for i := 0; i < slotNum; i++ {
x.slots[i] = create()
}
return x
}
type slotLRU[K comparable, V any] struct {
n uint64
slots []LRU[K, V]
hash func(k K) uint64
}
func (x *slotLRU[K, V]) getIndex(k K) uint64 {
return x.hash(k) % x.n
}
func (x *slotLRU[K, V]) Get(key K, fetch func() (V, error)) (V, error) {
return x.slots[x.getIndex(key)].Get(key, fetch)
}
func (x *slotLRU[K, V]) Del(key K) bool {
return x.slots[x.getIndex(key)].Del(key)
}
func (x *slotLRU[K, V]) Stop() {
for _, slot := range x.slots {
slot.Stop()
}
}

121
pkg/localcache/option.go Normal file
View File

@@ -0,0 +1,121 @@
package localcache
import (
"context"
"github.com/openimsdk/localcache/lru"
"time"
)
func defaultOption() *option {
return &option{
localSlotNum: 500,
localSlotSize: 20000,
linkSlotNum: 500,
expirationEvict: false,
localSuccessTTL: time.Minute,
localFailedTTL: time.Second * 5,
delFn: make([]func(ctx context.Context, key ...string), 0, 2),
target: emptyTarget{},
}
}
type option struct {
localSlotNum int
localSlotSize int
linkSlotNum int
// expirationEvict: true means that the cache will be actively cleared when the timer expires,
// false means that the cache will be lazily deleted.
expirationEvict bool
localSuccessTTL time.Duration
localFailedTTL time.Duration
delFn []func(ctx context.Context, key ...string)
target lru.Target
}
type Option func(o *option)
func WithExpirationEvict() Option {
return func(o *option) {
o.expirationEvict = true
}
}
func WithLazy() Option {
return func(o *option) {
o.expirationEvict = false
}
}
func WithLocalDisable() Option {
return WithLinkSlotNum(0)
}
func WithLinkDisable() Option {
return WithLinkSlotNum(0)
}
func WithLinkSlotNum(linkSlotNum int) Option {
return func(o *option) {
o.linkSlotNum = linkSlotNum
}
}
func WithLocalSlotNum(localSlotNum int) Option {
return func(o *option) {
o.localSlotNum = localSlotNum
}
}
func WithLocalSlotSize(localSlotSize int) Option {
return func(o *option) {
o.localSlotSize = localSlotSize
}
}
func WithLocalSuccessTTL(localSuccessTTL time.Duration) Option {
if localSuccessTTL < 0 {
panic("localSuccessTTL should be greater than 0")
}
return func(o *option) {
o.localSuccessTTL = localSuccessTTL
}
}
func WithLocalFailedTTL(localFailedTTL time.Duration) Option {
if localFailedTTL < 0 {
panic("localFailedTTL should be greater than 0")
}
return func(o *option) {
o.localFailedTTL = localFailedTTL
}
}
func WithTarget(target lru.Target) Option {
if target == nil {
panic("target should not be nil")
}
return func(o *option) {
o.target = target
}
}
func WithDeleteKeyBefore(fn func(ctx context.Context, key ...string)) Option {
if fn == nil {
panic("fn should not be nil")
}
return func(o *option) {
o.delFn = append(o.delFn, fn)
}
}
type emptyTarget struct{}
func (e emptyTarget) IncrGetHit() {}
func (e emptyTarget) IncrGetSuccess() {}
func (e emptyTarget) IncrGetFailed() {}
func (e emptyTarget) IncrDelHit() {}
func (e emptyTarget) IncrDelNotFound() {}

9
pkg/localcache/tool.go Normal file
View File

@@ -0,0 +1,9 @@
package localcache
func AnyValue[V any](v any, err error) (V, error) {
if err != nil {
var zero V
return zero, err
}
return v.(V), nil
}

20
pkg/rpccache/common.go Normal file
View File

@@ -0,0 +1,20 @@
package rpccache
func newListMap[V comparable](values []V, err error) (*listMap[V], error) {
if err != nil {
return nil, err
}
lm := &listMap[V]{
List: values,
Map: make(map[V]struct{}, len(values)),
}
for _, value := range values {
lm.Map[value] = struct{}{}
}
return lm, nil
}
type listMap[V comparable] struct {
List []V
Map map[V]struct{}
}

View File

@@ -0,0 +1,90 @@
package rpccache
import (
"context"
pbconversation "github.com/OpenIMSDK/protocol/conversation"
"github.com/OpenIMSDK/tools/errs"
"github.com/OpenIMSDK/tools/log"
"github.com/openimsdk/localcache"
"github.com/openimsdk/open-im-server/v3/pkg/common/cachekey"
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
"github.com/openimsdk/open-im-server/v3/pkg/rpcclient"
"github.com/redis/go-redis/v9"
)
func NewConversationLocalCache(client rpcclient.ConversationRpcClient, cli redis.UniversalClient) *ConversationLocalCache {
lc := config.Config.LocalCache.Conversation
log.ZDebug(context.Background(), "ConversationLocalCache", "topic", lc.Topic, "slotNum", lc.SlotNum, "slotSize", lc.SlotSize, "enable", lc.Enable())
x := &ConversationLocalCache{
client: client,
local: localcache.New[any](
localcache.WithLocalSlotNum(lc.SlotNum),
localcache.WithLocalSlotSize(lc.SlotSize),
localcache.WithLinkSlotNum(lc.SlotNum),
localcache.WithLocalSuccessTTL(lc.Success()),
localcache.WithLocalFailedTTL(lc.Failed()),
),
}
if lc.Enable() {
go subscriberRedisDeleteCache(context.Background(), cli, lc.Topic, x.local.DelLocal)
}
return x
}
type ConversationLocalCache struct {
client rpcclient.ConversationRpcClient
local localcache.Cache[any]
}
func (c *ConversationLocalCache) GetConversationIDs(ctx context.Context, ownerUserID string) (val []string, err error) {
log.ZDebug(ctx, "ConversationLocalCache GetConversationIDs req", "ownerUserID", ownerUserID)
defer func() {
if err == nil {
log.ZDebug(ctx, "ConversationLocalCache GetConversationIDs return", "value", val)
} else {
log.ZError(ctx, "ConversationLocalCache GetConversationIDs return", err)
}
}()
return localcache.AnyValue[[]string](c.local.Get(ctx, cachekey.GetConversationIDsKey(ownerUserID), func(ctx context.Context) (any, error) {
log.ZDebug(ctx, "ConversationLocalCache GetConversationIDs rpc", "ownerUserID", ownerUserID)
return c.client.GetConversationIDs(ctx, ownerUserID)
}))
}
func (c *ConversationLocalCache) GetConversation(ctx context.Context, userID, conversationID string) (val *pbconversation.Conversation, err error) {
log.ZDebug(ctx, "ConversationLocalCache GetConversation req", "userID", userID, "conversationID", conversationID)
defer func() {
if err == nil {
log.ZDebug(ctx, "ConversationLocalCache GetConversation return", "value", val)
} else {
log.ZError(ctx, "ConversationLocalCache GetConversation return", err)
}
}()
return localcache.AnyValue[*pbconversation.Conversation](c.local.Get(ctx, cachekey.GetConversationKey(userID, conversationID), func(ctx context.Context) (any, error) {
log.ZDebug(ctx, "ConversationLocalCache GetConversation rpc", "userID", userID, "conversationID", conversationID)
return c.client.GetConversation(ctx, userID, conversationID)
}))
}
func (c *ConversationLocalCache) GetSingleConversationRecvMsgOpt(ctx context.Context, userID, conversationID string) (int32, error) {
conv, err := c.GetConversation(ctx, userID, conversationID)
if err != nil {
return 0, err
}
return conv.RecvMsgOpt, nil
}
func (c *ConversationLocalCache) GetConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*pbconversation.Conversation, error) {
conversations := make([]*pbconversation.Conversation, 0, len(conversationIDs))
for _, conversationID := range conversationIDs {
conversation, err := c.GetConversation(ctx, ownerUserID, conversationID)
if err != nil {
if errs.ErrRecordNotFound.Is(err) {
continue
}
return nil, err
}
conversations = append(conversations, conversation)
}
return conversations, nil
}

Some files were not shown because too many files have changed in this diff Show More