Adding *managers

Co-authored-by: GabrieleYT9768 <GabrieleYT9768@users.noreply.github.com>
This commit is contained in:
Killer Boss Original 2023-08-02 17:44:35 +02:00
parent 1214feb42a
commit 64ebee326b
5 changed files with 223 additions and 31 deletions

0
lib/src/errors.dart Normal file
View file

View file

@ -1,29 +1,38 @@
import "dart:async"; import "dart:async";
import "dart:io"; import "dart:io";
import "package:tn_discord/src/requests.dart"; import "package:tn_discord/src/types.dart";
import "requests.dart";
import "types.dart";
import "dart:convert"; import "dart:convert";
import "package:events_emitter/events_emitter.dart"; import "package:events_emitter/events_emitter.dart";
final version = "10"; final version = "10";
final apiURL = "https://discord.com/api/v$version"; final apiURL = "https://discord.com/api/v$version";
int calculateIntents(List<int> intents) {
int intentsNumber = 0;
for (var element in intents) {
intentsNumber += element;
}
return intentsNumber;
}
class Client extends EventEmitter { class Client extends EventEmitter {
String? token; String? token;
List<GatewayIntentBits> intents = []; int intents;
bool logged = false;
dynamic ws; dynamic ws;
String resume_gateway_url = ""; String resumeGatewayURL = "";
String session_id = ""; String sessionID = "";
Client({List<GatewayIntentBits> intents = const []}); Client({this.intents = 0});
login(String token) async { login(String token) async {
final websocket = await requestWebSocketURL(); final websocket = await requestWebSocketURL();
this.token = token; this.token = token;
logged = true;
ws = await WebSocket.connect(websocket); ws = await WebSocket.connect(websocket);
@ -31,30 +40,30 @@ class Client extends EventEmitter {
"op": 2, "op": 2,
'd': { 'd': {
"token": token, "token": token,
"intents": 32767, "intents": intents,
"properties": { "properties": {
"os": "linux", "os": "linux",
"browser": "chrome", "browser": "tn_discord",
"device": "chrome", "device": "tn_discord",
}, },
} }
}; };
ws.add(json.encode(payload)); ws.add(json.encode(payload));
reconnect() { reconnect() async {
payload = { payload = {
"op": 6, "op": 6,
"d": {"token": token, "session_id": session_id, "seq": 1337} "d": {"token": token, "session_id": sessionID, "seq": 1337}
}; };
ws = WebSocket.connect(resume_gateway_url); ws = await WebSocket.connect(resumeGatewayURL);
ws.add(json.encode(payload)); ws.add(json.encode(payload));
} }
sendHeartBeat() { sendHeartBeat() {
payload = {"op": 1, "d": null}; payload = {"op": 1, "d": null};
ws.add(json.encode(payload)); ws.add(json.encode(payload));
print("Sent Heartbeat");
} }
heartbeatsender(int ms) { heartbeatsender(int ms) {
@ -64,11 +73,13 @@ class Client extends EventEmitter {
}); });
} }
Sender sender = Sender(token);
var i = await sender.getServer();
GuildManager(i);
ws.listen((event) { ws.listen((event) {
event = json.decode(event); event = json.decode(event);
print(event);
switch (event["op"]) { switch (event["op"]) {
case 1: case 1:
sendHeartBeat(); sendHeartBeat();
@ -78,6 +89,23 @@ class Client extends EventEmitter {
break; break;
case 7: case 7:
case 9: case 9:
reconnect();
break;
}
var eventName = event["t"];
switch (eventName) {
case "READY":
resumeGatewayURL = event["d"]["resume_gateway_url"];
sessionID = event["d"]["session_id"];
emit("READY", event["d"]);
break;
case "GUILD_CREATE":
break;
}
}, onDone: () {
switch (ws.closeCode) {
case 4000: case 4000:
case 4001: case 4001:
case 4002: case 4002:
@ -89,7 +117,7 @@ class Client extends EventEmitter {
reconnect(); reconnect();
break; break;
case 4004: case 4004:
throw Exception("[4014] Disallowed Intents"); throw Exception("[4004] Disallowed Intents");
case 4010: case 4010:
throw Exception("[4010] Invalid Shard"); throw Exception("[4010] Invalid Shard");
case 4011: case 4011:
@ -101,13 +129,6 @@ class Client extends EventEmitter {
case 4014: case 4014:
throw Exception("[4014] Disallowed Intents"); throw Exception("[4014] Disallowed Intents");
} }
var eventName = event["t"];
switch (eventName) {
case "READY":
emit("READY", event);
}
}); });
} }
} }

View file

@ -43,4 +43,12 @@ class Sender {
"Authorization": "Bot $token" "Authorization": "Bot $token"
}; };
} }
Future getServer() async {
final url = Uri.parse("$apiURL/users/@me/guilds");
dynamic res = await http.get(url, headers: headers);
res = json.decode(res.body);
return res;
}
} }

View file

@ -1,4 +1,10 @@
// ignore_for_file: non_constant_identifier_names, constant_identifier_names // ignore_for_file: constant_identifier_names
import "dart:convert";
import "package:http/http.dart" as http;
import "main.dart";
class GatewayIntentBits { class GatewayIntentBits {
static const Guilds = 1; static const Guilds = 1;
@ -22,5 +28,164 @@ class GatewayIntentBits {
static const AutoModerationExecution = 2097152; static const AutoModerationExecution = 2097152;
} }
class Collection {
final Map<String, dynamic> _variables = {};
Collection();
dynamic set(String key, dynamic value) {
_variables[key] = value;
return value;
}
dynamic get(String key) {
return _variables[key];
}
void remove(String key) {
_variables.remove(key);
}
dynamic add(String key, num value) {
_variables[key] += value;
return value + _variables[key];
}
dynamic subtract(String key, num value) {
_variables[key] -= value;
return value - _variables[key];
}
}
class Guild {
String id = '';
String name = '';
String owner = '';
String description = '';
Guild(Map data) {
id = data["id"];
name = data["name"];
description = data["description"];
owner = data["owner_id"];
}
}
class GuildManager {
final Collection cache = Collection();
GuildManager(List<Guild> guilds) {
for (var guild in guilds) {
cache.set(guild.id, guild);
}
}
Future<Guild> fetch(String id) async {
var res = await http.get(Uri.parse("$apiURL/guilds/$id"));
if (res.statusCode != 200) {
throw Exception("Error ${res.statusCode} receiving the guild");
}
final guild = Guild(json.decode(res.body));
cache.set(guild.id, guild);
return guild;
}
}
class Channel {
String id = '';
String name = '';
Channel(Map data) {
id = data["id"];
name = data["name"];
}
}
class ChannelManager {
final Collection cache = Collection();
ChannelManager(List<Channel> channels) {
for (var channel in channels) {
cache.set(channel.id, channel);
}
}
Future<Channel> fetch(String id) async {
var res = await http.get(Uri.parse("$apiURL/channels/$id"));
if (res.statusCode != 200) {
throw Exception("Error ${res.statusCode} receiving the channel");
}
dynamic channel = Channel(json.decode(res.body));
cache.set(channel.id, channel);
return channel;
}
}
class Role {
//
}
class RoleManager {
//
}
class Member {
User? user;
RoleManager? roles;
String joinedAt = '';
int flags = 0;
Member(Map data) {
user = User(data["user"]);
joinedAt = data["joined_at"];
int flags = 0;
}
}
class MemberManager {
//
}
class User {
String id = '';
bool bot = false;
String username = '';
String globalName = '';
String displayName = '';
int discriminator = 0;
String avatar = '';
User(Map data) {
id = data["id"];
bot = data["bot"];
username = data["username"];
globalName = data["global_name"];
displayName = data["display_name"];
discriminator = data["discriminator"];
avatar = "https://cdn.discordapp.com/avatars/$id/${data["avatar"]}.webp";
}
}
class UserManager {
final Collection cache = Collection();
UserManager(List<User> users) {
for (var user in users) {
cache.set(user.id, user);
}
}
Future<User> fetch(String id) async {
var res = await http.get(Uri.parse("$apiURL/users/$id"));
if (res.statusCode != 200) {
throw Exception("Error ${res.statusCode} receiving the user");
}
dynamic user = User(json.decode(res.body));
cache.set(user.id, user);
return user;
}
}
typedef Embed = Map<String, String>; typedef Embed = Map<String, String>;
typedef Message = Map<String, String>; typedef Message = Map<String, String>;

View file

@ -29,8 +29,7 @@ class WebhookClient {
return json.decode(res.body); return json.decode(res.body);
} }
Future<Map<String, dynamic>> send( Future<Map<String, dynamic>> send({String? content, List<Embed>? embeds}) async {
{String? content, List<Embed>? embeds}) async {
Map<String, dynamic> body = Map<String, dynamic> body =
Utils().createMessage(text: content, embeds: embeds); Utils().createMessage(text: content, embeds: embeds);
@ -48,8 +47,7 @@ class WebhookClient {
return json.decode(res.body); return json.decode(res.body);
} }
Future<Map<String, dynamic>> edit(String id, Future<Map<String, dynamic>> edit(String id, {String content = "", List<Embed> embeds = const []}) async {
{String content = "", List<Embed> embeds = const []}) async {
Map body = {"content": content, "embeds": embeds}; Map body = {"content": content, "embeds": embeds};
Response res = await editWH(body, token, this.id, id); Response res = await editWH(body, token, this.id, id);