Примеры кода
Готовые примеры интеграции на разных языках
JavaScript / TypeScript
Базовая настройка
// api.js
const API_BASE_URL = 'https://api.enot.space';
class EnotAPI {
constructor(token) {
this.token = token;
}
async request(endpoint, options = {}) {
const url = `${API_BASE_URL}${endpoint}`;
const headers = {
'Content-Type': 'application/json',
...options.headers,
};
if (this.token) {
headers['Authorization'] = `Bearer ${this.token}`;
}
const response = await fetch(url, {
...options,
headers,
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.message);
}
return await response.json();
}
// Auth
async register(username, email, password) {
return this.request('/api/auth/register', {
method: 'POST',
body: JSON.stringify({ username, email, password }),
});
}
async login(username, password) {
return this.request('/api/auth/login', {
method: 'POST',
body: JSON.stringify({ username, password }),
});
}
async getMe() {
return this.request('/api/auth/me');
}
// Servers
async getServers() {
return this.request('/api/servers');
}
async createServer(name, description) {
return this.request('/api/servers', {
method: 'POST',
body: JSON.stringify({ name, description }),
});
}
// Messages
async getMessages(channelId, limit = 50, offset = 0) {
return this.request(`/api/channels/${channelId}/messages?limit=${limit}&offset=${offset}`);
}
async sendMessage(channelId, content) {
return this.request(`/api/channels/${channelId}/messages`, {
method: 'POST',
body: JSON.stringify({ content }),
});
}
}
export default EnotAPI;
WebSocket подключение
// websocket.js
class EnotWebSocket {
constructor(token) {
this.token = token;
this.ws = null;
this.reconnectAttempts = 0;
this.maxReconnectAttempts = 5;
this.handlers = {};
}
connect() {
this.ws = new WebSocket(`wss://api.enot.space/ws?token=${this.token}`);
this.ws.onopen = () => {
console.log('WebSocket connected');
this.reconnectAttempts = 0;
};
this.ws.onmessage = (event) => {
const message = JSON.parse(event.data);
this.handleMessage(message);
};
this.ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
this.ws.onclose = () => {
console.log('WebSocket disconnected');
this.reconnect();
};
}
reconnect() {
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
console.error('Max reconnect attempts reached');
return;
}
const delay = Math.pow(2, this.reconnectAttempts) * 1000;
this.reconnectAttempts++;
setTimeout(() => {
console.log(`Reconnecting... (attempt ${this.reconnectAttempts})`);
this.connect();
}, delay);
}
handleMessage(message) {
const handler = this.handlers[message.type];
if (handler) {
handler(message.data);
}
}
on(type, handler) {
this.handlers[type] = handler;
}
send(type, data) {
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify({ type, ...data }));
}
}
subscribe(channelId) {
this.send('subscribe', { channel_id: channelId });
}
unsubscribe(channelId) {
this.send('unsubscribe', { channel_id: channelId });
}
disconnect() {
if (this.ws) {
this.ws.close();
}
}
}
export default EnotWebSocket;
Использование
// app.js
import EnotAPI from './api.js';
import EnotWebSocket from './websocket.js';
// Регистрация
const api = new EnotAPI();
const { user, token } = await api.register('myusername', 'user@example.com', 'SecurePassword123!');
// Сохранить токен
localStorage.setItem('token', token);
// Создать API клиент с токеном
const authenticatedAPI = new EnotAPI(token);
// Получить серверы
const servers = await authenticatedAPI.getServers();
console.log('My servers:', servers);
// Подключиться к WebSocket
const ws = new EnotWebSocket(token);
ws.connect();
// Подписаться на новые сообщения
ws.on('message_new', (message) => {
console.log('New message:', message);
displayMessage(message);
});
// Подписаться на канал
ws.subscribe(123);
// Отправить сообщение
await authenticatedAPI.sendMessage(123, 'Hello, world!');
React + TypeScript
Custom Hook для API
// useEnotAPI.ts
import { useState, useEffect } from 'react';
interface Message {
id: number;
content: string;
user_id: number;
channel_id: number;
created_at: string;
}
export function useMessages(channelId: number, token: string) {
const [messages, setMessages] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchMessages() {
try {
const response = await fetch(
`https://api.enot.space/api/channels/${channelId}/messages`,
{
headers: {
'Authorization': `Bearer ${token}`
}
}
);
if (!response.ok) {
throw new Error('Failed to fetch messages');
}
const data = await response.json();
setMessages(data);
} catch (err) {
setError(err instanceof Error ? err.message : 'Unknown error');
} finally {
setLoading(false);
}
}
fetchMessages();
}, [channelId, token]);
return { messages, loading, error };
}
Компонент чата
// Chat.tsx
import React, { useState } from 'react';
import { useMessages } from './useEnotAPI';
interface ChatProps {
channelId: number;
token: string;
}
export function Chat({ channelId, token }: ChatProps) {
const { messages, loading, error } = useMessages(channelId, token);
const [newMessage, setNewMessage] = useState('');
const sendMessage = async () => {
const response = await fetch(
`https://api.enot.space/api/channels/${channelId}/messages`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ content: newMessage })
}
);
if (response.ok) {
setNewMessage('');
}
};
if (loading) return Loading...;
if (error) return Error: {error};
return (
{messages.map(msg => (
User {msg.user_id}: {msg.content}
))}
setNewMessage(e.target.value)}
placeholder="Type a message..."
/>
);
}
Python
Базовая настройка
# enot_api.py
import requests
class EnotAPI:
def __init__(self, token=None):
self.base_url = 'https://api.enot.space'
self.token = token
self.headers = {'Content-Type': 'application/json'}
if token:
self.headers['Authorization'] = f'Bearer {token}'
def request(self, method, endpoint, data=None):
url = f'{self.base_url}{endpoint}'
response = requests.request(
method,
url,
headers=self.headers,
json=data
)
response.raise_for_status()
return response.json()
# Auth
def register(self, username, email, password):
return self.request('POST', '/api/auth/register', {
'username': username,
'email': email,
'password': password
})
def login(self, username, password):
return self.request('POST', '/api/auth/login', {
'username': username,
'password': password
})
# Servers
def get_servers(self):
return self.request('GET', '/api/servers')
def create_server(self, name, description=''):
return self.request('POST', '/api/servers', {
'name': name,
'description': description
})
# Messages
def send_message(self, channel_id, content):
return self.request('POST', f'/api/channels/{channel_id}/messages', {
'content': content
})
Использование
# main.py
from enot_api import EnotAPI
# Регистрация
api = EnotAPI()
result = api.register('myusername', 'user@example.com', 'SecurePassword123!')
token = result['token']
# Создать API клиент с токеном
authenticated_api = EnotAPI(token)
# Получить серверы
servers = authenticated_api.get_servers()
print('My servers:', servers)
# Отправить сообщение
message = authenticated_api.send_message(123, 'Hello from Python!')
print('Sent message:', message)
Дополнительные ресурсы
Полная документация API: API Reference
WebSocket документация: WebSocket
Примеры на GitHub: GitHub Repository