mirror of
https://github.com/logos-messaging/OpChan.git
synced 2026-01-05 22:33:07 +00:00
264 lines
5.6 KiB
Markdown
264 lines
5.6 KiB
Markdown
|
|
# OpChan Core - Quick Start
|
||
|
|
|
||
|
|
Get up and running with OpChan in 5 minutes.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Installation
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npm install @opchan/core
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Minimal Working Example
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { OpChanClient, EVerificationStatus, EDisplayPreference } from '@opchan/core';
|
||
|
|
|
||
|
|
// 1. Create client
|
||
|
|
const client = new OpChanClient({
|
||
|
|
wakuConfig: {
|
||
|
|
contentTopic: '/opchan/1/messages/proto',
|
||
|
|
reliableChannelId: 'opchan-messages'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// 2. Open database
|
||
|
|
await client.database.open();
|
||
|
|
|
||
|
|
// 3. Listen for messages
|
||
|
|
client.messageManager.onMessageReceived(async (message) => {
|
||
|
|
await client.database.applyMessage(message);
|
||
|
|
console.log('Received:', message.type);
|
||
|
|
});
|
||
|
|
|
||
|
|
// 4. Start anonymous session
|
||
|
|
const sessionId = await client.delegation.delegateAnonymous('7days');
|
||
|
|
const user = {
|
||
|
|
address: sessionId,
|
||
|
|
displayName: 'Anonymous',
|
||
|
|
displayPreference: EDisplayPreference.WALLET_ADDRESS,
|
||
|
|
verificationStatus: EVerificationStatus.ANONYMOUS
|
||
|
|
};
|
||
|
|
|
||
|
|
// 5. Create a post
|
||
|
|
const result = await client.forumActions.createPost(
|
||
|
|
{
|
||
|
|
cellId: 'general',
|
||
|
|
title: 'Hello World',
|
||
|
|
content: 'My first post!',
|
||
|
|
currentUser: user,
|
||
|
|
isAuthenticated: true
|
||
|
|
},
|
||
|
|
() => console.log('Post created!')
|
||
|
|
);
|
||
|
|
|
||
|
|
// 6. Read posts
|
||
|
|
const posts = Object.values(client.database.cache.posts);
|
||
|
|
console.log('Posts:', posts.length);
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Essential Operations
|
||
|
|
|
||
|
|
### Create Content
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Post
|
||
|
|
await client.forumActions.createPost({
|
||
|
|
cellId: 'general',
|
||
|
|
title: 'Title',
|
||
|
|
content: 'Content',
|
||
|
|
currentUser: user,
|
||
|
|
isAuthenticated: true
|
||
|
|
}, () => {});
|
||
|
|
|
||
|
|
// Comment
|
||
|
|
await client.forumActions.createComment({
|
||
|
|
postId: 'post-id',
|
||
|
|
content: 'Great post!',
|
||
|
|
currentUser: user,
|
||
|
|
isAuthenticated: true
|
||
|
|
}, () => {});
|
||
|
|
|
||
|
|
// Vote
|
||
|
|
await client.forumActions.vote({
|
||
|
|
targetId: 'post-id',
|
||
|
|
isUpvote: true,
|
||
|
|
currentUser: user,
|
||
|
|
isAuthenticated: true
|
||
|
|
}, () => {});
|
||
|
|
```
|
||
|
|
|
||
|
|
### Read Content
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// All cells
|
||
|
|
const cells = Object.values(client.database.cache.cells);
|
||
|
|
|
||
|
|
// All posts
|
||
|
|
const posts = Object.values(client.database.cache.posts);
|
||
|
|
|
||
|
|
// Posts in a cell
|
||
|
|
const cellPosts = posts.filter(p => p.cellId === 'cell-id');
|
||
|
|
|
||
|
|
// Comments on a post
|
||
|
|
const comments = Object.values(client.database.cache.comments)
|
||
|
|
.filter(c => c.postId === 'post-id');
|
||
|
|
|
||
|
|
// Votes on a post
|
||
|
|
const votes = Object.values(client.database.cache.votes)
|
||
|
|
.filter(v => v.targetId === 'post-id');
|
||
|
|
```
|
||
|
|
|
||
|
|
### Network Status
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Check connection
|
||
|
|
const isReady = client.messageManager.isReady;
|
||
|
|
|
||
|
|
// Listen for changes
|
||
|
|
client.messageManager.onHealthChange((isHealthy) => {
|
||
|
|
console.log(isHealthy ? 'Connected' : 'Offline');
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Complete Starter Template
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { OpChanClient, EVerificationStatus, EDisplayPreference, type User } from '@opchan/core';
|
||
|
|
|
||
|
|
class MyForumApp {
|
||
|
|
private client: OpChanClient;
|
||
|
|
private currentUser: User | null = null;
|
||
|
|
|
||
|
|
async init() {
|
||
|
|
// Initialize
|
||
|
|
this.client = new OpChanClient({
|
||
|
|
wakuConfig: {
|
||
|
|
contentTopic: '/opchan/1/messages/proto',
|
||
|
|
reliableChannelId: 'opchan-messages'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
await this.client.database.open();
|
||
|
|
|
||
|
|
// Set up listeners
|
||
|
|
client.messageManager.onMessageReceived(async (message) => {
|
||
|
|
await client.database.applyMessage(message);
|
||
|
|
this.onNewMessage(message);
|
||
|
|
});
|
||
|
|
|
||
|
|
// Start session
|
||
|
|
const sessionId = await client.delegation.delegateAnonymous('7days');
|
||
|
|
this.currentUser = {
|
||
|
|
address: sessionId,
|
||
|
|
displayName: 'Anonymous',
|
||
|
|
displayPreference: EDisplayPreference.WALLET_ADDRESS,
|
||
|
|
verificationStatus: EVerificationStatus.ANONYMOUS
|
||
|
|
};
|
||
|
|
|
||
|
|
this.render();
|
||
|
|
}
|
||
|
|
|
||
|
|
async createPost(cellId: string, title: string, content: string) {
|
||
|
|
if (!this.currentUser) return;
|
||
|
|
|
||
|
|
const result = await this.client.forumActions.createPost(
|
||
|
|
{ cellId, title, content, currentUser: this.currentUser, isAuthenticated: true },
|
||
|
|
() => this.render()
|
||
|
|
);
|
||
|
|
|
||
|
|
if (!result.success) {
|
||
|
|
console.error('Failed:', result.error);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private onNewMessage(message: any) {
|
||
|
|
console.log('New message:', message.type);
|
||
|
|
this.render();
|
||
|
|
}
|
||
|
|
|
||
|
|
private render() {
|
||
|
|
const posts = Object.values(this.client.database.cache.posts);
|
||
|
|
console.log('Posts:', posts.length);
|
||
|
|
// Update your UI here
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Start
|
||
|
|
const app = new MyForumApp();
|
||
|
|
await app.init();
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
- **Full Documentation**: See [README.md](./README.md)
|
||
|
|
- **Getting Started Guide**: See [docs/getting-started.md](./docs/getting-started.md)
|
||
|
|
- **API Reference**: See [docs/api-reference.md](./docs/api-reference.md)
|
||
|
|
- **Architecture**: See [docs/architecture.md](./docs/architecture.md)
|
||
|
|
- **Sample Apps**: See [docs/sample-apps.md](./docs/sample-apps.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Common Patterns
|
||
|
|
|
||
|
|
### Wallet Connection
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { signMessage } from 'viem/accounts';
|
||
|
|
|
||
|
|
await client.delegation.delegate(
|
||
|
|
walletAddress,
|
||
|
|
'7days',
|
||
|
|
async (msg) => await signMessage({ message: msg, account: walletAddress })
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### ENS Resolution
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { createPublicClient, http } from 'viem';
|
||
|
|
import { mainnet } from 'viem/chains';
|
||
|
|
|
||
|
|
const publicClient = createPublicClient({
|
||
|
|
chain: mainnet,
|
||
|
|
transport: http()
|
||
|
|
});
|
||
|
|
|
||
|
|
client.userIdentityService.setPublicClient(publicClient);
|
||
|
|
|
||
|
|
const identity = await client.userIdentityService.getIdentity(address);
|
||
|
|
console.log('ENS name:', identity?.ensName);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Relevance Scoring
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { transformPost } from '@opchan/core';
|
||
|
|
|
||
|
|
const post = await transformPost(postMessage);
|
||
|
|
console.log('Relevance score:', post?.relevanceScore);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Bookmarks
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { BookmarkService } from '@opchan/core';
|
||
|
|
|
||
|
|
const bookmarkService = new BookmarkService();
|
||
|
|
await bookmarkService.addPostBookmark(post, userId, cellId);
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Ready to build!** 🚀
|
||
|
|
|