aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-06-20 22:52:50 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-06-20 22:52:50 -0400
commit5c3da90f441c321f55ae735d6002f4da91f2481e (patch)
treeac6a993595eebe38fd5e7bd79ade4c5ec71be373 /src/lib
parent87e77ae8cc69d0d7f1e3d6f614b03c9297e85ab3 (diff)
downloadtanzanite-5c3da90f441c321f55ae735d6002f4da91f2481e.tar.gz
tanzanite-5c3da90f441c321f55ae735d6002f4da91f2481e.tar.bz2
tanzanite-5c3da90f441c321f55ae735d6002f4da91f2481e.zip
feat(*): aaaaa
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/extensions/BushClient.ts14
-rw-r--r--src/lib/extensions/BushClientUtil.ts125
-rw-r--r--src/lib/extensions/BushCommand.ts6
-rw-r--r--src/lib/extensions/BushCommandUtil.ts10
-rw-r--r--src/lib/extensions/BushMessage.ts2
-rw-r--r--src/lib/models/Global.ts50
-rw-r--r--src/lib/models/Guild.ts16
-rw-r--r--src/lib/models/Level.ts2
-rw-r--r--src/lib/models/Modlog.ts2
-rw-r--r--src/lib/models/StickyRole.ts40
-rw-r--r--src/lib/models/index.ts6
-rw-r--r--src/lib/utils/BushConstants.ts31
-rw-r--r--src/lib/utils/BushLogger.ts8
-rw-r--r--src/lib/utils/CanvasProgressBar.ts78
14 files changed, 269 insertions, 121 deletions
diff --git a/src/lib/extensions/BushClient.ts b/src/lib/extensions/BushClient.ts
index 8592281..ad22cfe 100644
--- a/src/lib/extensions/BushClient.ts
+++ b/src/lib/extensions/BushClient.ts
@@ -9,6 +9,7 @@ import * as config from '../../config/options';
import * as Models from '../models';
import AllowedMentions from '../utils/AllowedMentions';
import { BushCache } from '../utils/BushCache';
+import { BushConstants } from '../utils/BushConstants';
import { BushLogger } from '../utils/BushLogger';
import { BushClientUtil } from './BushClientUtil';
import { BushCommandHandler } from './BushCommandHandler';
@@ -34,6 +35,7 @@ export class BushClient extends AkairoClient {
public declare ownerID: Snowflake[];
public db: Sequelize;
public logger: BushLogger;
+ public constants = BushConstants;
constructor(config: BotConfig) {
super(
{
@@ -107,7 +109,7 @@ export class BushClient extends AkairoClient {
dialect: 'postgres',
host: this.config.db.host,
port: this.config.db.port,
- logging: false
+ logging: (a, b) => this.logger.debug(a)
});
this.logger = new BushLogger(this);
}
@@ -116,6 +118,10 @@ export class BushClient extends AkairoClient {
return this.logger;
}
+ get consts(): typeof BushConstants {
+ return this.constants;
+ }
+
// Initialize everything
private async _init(): Promise<void> {
this.commandHandler.useListenerHandler(this.listenerHandler);
@@ -152,17 +158,20 @@ export class BushClient extends AkairoClient {
public async dbPreInit(): Promise<void> {
try {
await this.db.authenticate();
+ Models.Global.initModel(this.db);
Models.Guild.initModel(this.db, this);
Models.Modlog.initModel(this.db);
Models.Ban.initModel(this.db);
Models.Level.initModel(this.db);
+ Models.StickyRole.initModel(this.db);
await this.db.sync(); // Sync all tables to fix everything if updated
this.console.success('Startup', `Successfully connected to <<database>>.`, false);
} catch (error) {
- this.console.error('Startup', `Failed to connect to <<database>> with error:\n` + error, false);
+ this.console.error('Startup', `Failed to connect to <<database>> with error:\n` + error?.stack, false);
}
}
+ /** Starts the bot */
public async start(): Promise<void> {
try {
await this._init();
@@ -173,6 +182,7 @@ export class BushClient extends AkairoClient {
}
}
+ /** Logs out, terminates the connection to Discord, and destroys the client. */
public destroy(relogin = false): void | Promise<string> {
super.destroy();
if (relogin) {
diff --git a/src/lib/extensions/BushClientUtil.ts b/src/lib/extensions/BushClientUtil.ts
index 2ecdc42..6687cb0 100644
--- a/src/lib/extensions/BushClientUtil.ts
+++ b/src/lib/extensions/BushClientUtil.ts
@@ -267,34 +267,6 @@ export class BushClientUtil extends ClientUtil {
return apiRes.uuid.replace(/-/g, '');
}
- public moulberryBushRoleMap = [
- { name: '*', id: '792453550768390194' },
- { name: 'Admin Perms', id: '746541309853958186' },
- { name: 'Sr. Moderator', id: '782803470205190164' },
- { name: 'Moderator', id: '737308259823910992' },
- { name: 'Helper', id: '737440116230062091' },
- { name: 'Trial Helper', id: '783537091946479636' },
- { name: 'Contributor', id: '694431057532944425' },
- { name: 'Giveaway Donor', id: '784212110263451649' },
- { name: 'Giveaway (200m)', id: '810267756426690601' },
- { name: 'Giveaway (100m)', id: '801444430522613802' },
- { name: 'Giveaway (50m)', id: '787497512981757982' },
- { name: 'Giveaway (25m)', id: '787497515771232267' },
- { name: 'Giveaway (10m)', id: '787497518241153025' },
- { name: 'Giveaway (5m)', id: '787497519768403989' },
- { name: 'Giveaway (1m)', id: '787497521084891166' },
- { name: 'Suggester', id: '811922322767609877' },
- { name: 'Partner', id: '767324547312779274' },
- { name: 'Level Locked', id: '784248899044769792' },
- { name: 'No Files', id: '786421005039173633' },
- { name: 'No Reactions', id: '786421270924361789' },
- { name: 'No Links', id: '786421269356740658' },
- { name: 'No Bots', id: '786804858765312030' },
- { name: 'No VC', id: '788850482554208267' },
- { name: 'No Giveaways', id: '808265422334984203' },
- { name: 'No Support', id: '790247359824396319' }
- ];
-
/** Paginates an array of embeds using buttons. */
public async buttonPaginate(
message: BushMessage,
@@ -487,83 +459,26 @@ export class BushClientUtil extends ClientUtil {
public getConfigChannel(channel: 'log' | 'error' | 'dm'): Promise<TextChannel> {
return this.client.channels.fetch(this.client.config.channels[channel]) as Promise<TextChannel>;
}
-}
-
-// I just copy pasted this code from stackoverflow don't yell at me if there is issues for it
-export class CanvasProgressBar {
- private x: number;
- private y: number;
- private w: number;
- private h: number;
- private color: string;
- private percentage: number;
- private p: number;
- private ctx: CanvasRenderingContext2D;
-
- constructor(
- ctx: CanvasRenderingContext2D,
- dimension: { x: number; y: number; width: number; height: number },
- color: string,
- percentage: number
- ) {
- ({ x: this.x, y: this.y, width: this.w, height: this.h } = dimension);
- this.color = color;
- this.percentage = percentage;
- this.p;
- this.ctx = ctx;
- }
- draw(): void {
- // -----------------
- this.p = this.percentage * this.w;
- if (this.p <= this.h) {
- this.ctx.beginPath();
- this.ctx.arc(
- this.h / 2 + this.x,
- this.h / 2 + this.y,
- this.h / 2,
- Math.PI - Math.acos((this.h - this.p) / this.h),
- Math.PI + Math.acos((this.h - this.p) / this.h)
- );
- this.ctx.save();
- this.ctx.scale(-1, 1);
- this.ctx.arc(
- this.h / 2 - this.p - this.x,
- this.h / 2 + this.y,
- this.h / 2,
- Math.PI - Math.acos((this.h - this.p) / this.h),
- Math.PI + Math.acos((this.h - this.p) / this.h)
- );
- this.ctx.restore();
- this.ctx.closePath();
- } else {
- this.ctx.beginPath();
- this.ctx.arc(this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, Math.PI / 2, (3 / 2) * Math.PI);
- this.ctx.lineTo(this.p - this.h + this.x, 0 + this.y);
- this.ctx.arc(this.p - this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, (3 / 2) * Math.PI, Math.PI / 2);
- this.ctx.lineTo(this.h / 2 + this.x, this.h + this.y);
- this.ctx.closePath();
- }
- this.ctx.fillStyle = this.color;
- this.ctx.fill();
- }
-
- // showWholeProgressBar(){
- // this.ctx.beginPath();
- // this.ctx.arc(this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, Math.PI / 2, 3 / 2 * Math.PI);
- // this.ctx.lineTo(this.w - this.h + this.x, 0 + this.y);
- // this.ctx.arc(this.w - this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, 3 / 2 *Math.PI, Math.PI / 2);
- // this.ctx.lineTo(this.h / 2 + this.x, this.h + this.y);
- // this.ctx.strokeStyle = '#000000';
- // this.ctx.stroke();
- // this.ctx.closePath();
- // }
-
- get PPercentage(): number {
- return this.percentage * 100;
- }
-
- set PPercentage(x: number) {
- this.percentage = x / 100;
+ /**
+ * Takes an array and combines the elements using the supplied conjunction.
+ *
+ * @param {string[]} array The array to combine.
+ * @param {string} conjunction The conjunction to use.
+ * @param {string} ifEmpty What to return if the array is empty.
+ * @returns The combined elements or `ifEmpty`
+ *
+ * @example
+ * const permissions = oxford(['ADMINISTRATOR', 'SEND_MESSAGES', 'MANAGE_MESSAGES'], 'and', 'none');
+ * console.log(permissions); // ADMINISTRATOR, SEND_MESSAGES and MANAGE_MESSAGES
+ */
+ public oxford(array: string[], conjunction: string, ifEmpty: string): string {
+ const l = array.length;
+ if (!l) return ifEmpty;
+ if (l < 2) return array[0];
+ if (l < 3) return array.join(` ${conjunction} `);
+ array = array.slice();
+ array[l - 1] = `${conjunction} ${array[l - 1]}`;
+ return array.join(', ');
}
}
diff --git a/src/lib/extensions/BushCommand.ts b/src/lib/extensions/BushCommand.ts
index edd3c31..8358c46 100644
--- a/src/lib/extensions/BushCommand.ts
+++ b/src/lib/extensions/BushCommand.ts
@@ -1,9 +1,9 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Command, CommandOptions } from 'discord-akairo';
-import { APIApplicationCommandOption } from 'discord-api-types';
import { Snowflake } from 'discord.js';
import { BushClient } from './BushClient';
+import { BushCommandHandler } from './BushCommandHandler';
import { BushInteractionMessage } from './BushInteractionMessage';
import { BushMessage } from './BushMessage';
@@ -11,7 +11,6 @@ export interface BushCommandOptions extends CommandOptions {
hidden?: boolean;
restrictedChannels?: Snowflake[];
restrictedGuilds?: Snowflake[];
- slashCommandOptions?: APIApplicationCommandOption[];
description: {
content: string;
usage: string;
@@ -21,6 +20,7 @@ export interface BushCommandOptions extends CommandOptions {
export class BushCommand extends Command {
public declare client: BushClient;
+ public declare handler: BushCommandHandler;
public options: BushCommandOptions;
/** The channels the command is limited to run in. */
public restrictedChannels: Snowflake[];
@@ -37,9 +37,7 @@ export class BushCommand extends Command {
}
public exec(message: BushMessage, args: any): any;
- // @ts-ignore: They are close enough
public exec(message: BushMessage | BushInteractionMessage, args: any): any {
- // @ts-ignore: They are close enough
super.exec(message, args);
}
}
diff --git a/src/lib/extensions/BushCommandUtil.ts b/src/lib/extensions/BushCommandUtil.ts
new file mode 100644
index 0000000..b4084bd
--- /dev/null
+++ b/src/lib/extensions/BushCommandUtil.ts
@@ -0,0 +1,10 @@
+import { CommandUtil, ParsedComponentData } from 'discord-akairo';
+import { BushCommand } from './BushCommand';
+
+export interface BushParsedComponentData extends ParsedComponentData {
+ command?: BushCommand;
+}
+
+export class BushCommandUtil extends CommandUtil {
+ declare parsed?: BushParsedComponentData;
+}
diff --git a/src/lib/extensions/BushMessage.ts b/src/lib/extensions/BushMessage.ts
index e7146f6..afa6bde 100644
--- a/src/lib/extensions/BushMessage.ts
+++ b/src/lib/extensions/BushMessage.ts
@@ -1,8 +1,10 @@
import { DMChannel, Message, NewsChannel, TextChannel } from 'discord.js';
import { BushClient } from './BushClient';
+import { BushCommandUtil } from './BushCommandUtil';
export class BushMessage extends Message {
declare client: BushClient;
+ declare util: BushCommandUtil;
constructor(client: BushClient, data: unknown, channel: TextChannel | DMChannel | NewsChannel) {
super(client, data, channel);
this.client = client;
diff --git a/src/lib/models/Global.ts b/src/lib/models/Global.ts
new file mode 100644
index 0000000..65f51c4
--- /dev/null
+++ b/src/lib/models/Global.ts
@@ -0,0 +1,50 @@
+import { Snowflake } from 'discord.js';
+import { DataTypes, Optional, Sequelize } from 'sequelize';
+import { BaseModel } from './BaseModel';
+
+export interface GlobalModel {
+ superUsers: Snowflake[];
+ disabledCommands: string[];
+ blacklistedUsers: Snowflake[];
+ blacklistedGuilds: Snowflake[];
+ blacklistedChannels: Snowflake[];
+}
+export type GlobalModelCreationAttributes = Optional<
+ GlobalModel,
+ 'superUsers' | 'disabledCommands' | 'blacklistedUsers' | 'blacklistedGuilds' | 'blacklistedChannels'
+>;
+
+export class Global extends BaseModel<GlobalModel, GlobalModelCreationAttributes> implements GlobalModel {
+ superUsers: Snowflake[];
+ disabledCommands: string[];
+ blacklistedUsers: Snowflake[];
+ blacklistedGuilds: Snowflake[];
+ blacklistedChannels: Snowflake[];
+ static initModel(sequelize: Sequelize): void {
+ Global.init(
+ {
+ superUsers: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
+ },
+ disabledCommands: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
+ },
+ blacklistedUsers: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
+ },
+ blacklistedGuilds: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
+ },
+ blacklistedChannels: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
+ }
+ },
+ { sequelize }
+ );
+ }
+}
diff --git a/src/lib/models/Guild.ts b/src/lib/models/Guild.ts
index 7902461..bc93951 100644
--- a/src/lib/models/Guild.ts
+++ b/src/lib/models/Guild.ts
@@ -1,3 +1,4 @@
+import { Snowflake } from 'discord.js';
import { DataTypes, Optional, Sequelize } from 'sequelize';
import { BushClient } from '../extensions/BushClient';
import { BaseModel } from './BaseModel';
@@ -5,12 +6,17 @@ import { BaseModel } from './BaseModel';
export interface GuildModel {
id: string;
prefix: string;
+ autoPublishChannels: string[];
+ blacklistedChannels: Snowflake[];
}
-export type GuildModelCreationAttributes = Optional<GuildModel, 'prefix'>;
+
+export type GuildModelCreationAttributes = Optional<GuildModel, 'prefix' | 'autoPublishChannels' | 'blacklistedChannels'>;
export class Guild extends BaseModel<GuildModel, GuildModelCreationAttributes> implements GuildModel {
id: string;
prefix: string;
+ autoPublishChannels: string[];
+ blacklistedChannels: Snowflake[];
static initModel(seqeulize: Sequelize, client: BushClient): void {
Guild.init(
{
@@ -22,6 +28,14 @@ export class Guild extends BaseModel<GuildModel, GuildModelCreationAttributes> i
type: DataTypes.STRING,
allowNull: false,
defaultValue: client.config.prefix
+ },
+ autoPublishChannels: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
+ },
+ blacklistedChannels: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: true
}
},
{ sequelize: seqeulize }
diff --git a/src/lib/models/Level.ts b/src/lib/models/Level.ts
index 426ec1a..6113627 100644
--- a/src/lib/models/Level.ts
+++ b/src/lib/models/Level.ts
@@ -32,7 +32,7 @@ export class Level extends BaseModel<LevelModel, LevelModelCreationAttributes> {
defaultValue: 0
}
},
- { sequelize: sequelize }
+ { sequelize }
);
}
static convertXpToLevel(xp: number): number {
diff --git a/src/lib/models/Modlog.ts b/src/lib/models/Modlog.ts
index 5a2cb69..15c5030 100644
--- a/src/lib/models/Modlog.ts
+++ b/src/lib/models/Modlog.ts
@@ -77,7 +77,7 @@ export class Modlog extends BaseModel<ModlogModel, ModlogModelCreationAttributes
// }
}
},
- { sequelize: sequelize }
+ { sequelize }
);
}
}
diff --git a/src/lib/models/StickyRole.ts b/src/lib/models/StickyRole.ts
new file mode 100644
index 0000000..597d7c5
--- /dev/null
+++ b/src/lib/models/StickyRole.ts
@@ -0,0 +1,40 @@
+import { Snowflake } from 'discord.js';
+import { DataTypes, Sequelize } from 'sequelize';
+import { BaseModel } from './BaseModel';
+
+export interface StickyRoleModel {
+ user: Snowflake;
+ guild: Snowflake;
+ roles: Snowflake[];
+}
+export interface StickyRoleModelCreationAttributes {
+ user: Snowflake;
+ guild: Snowflake;
+ roles: Snowflake[];
+}
+
+export class StickyRole extends BaseModel<StickyRoleModel, StickyRoleModelCreationAttributes> implements StickyRoleModel {
+ user: Snowflake;
+ guild: Snowflake;
+ roles: Snowflake[];
+ static initModel(sequelize: Sequelize): void {
+ StickyRole.init(
+ {
+ user: {
+ type: DataTypes.STRING,
+ allowNull: false
+ },
+ guild: {
+ type: DataTypes.STRING,
+ allowNull: false
+ },
+
+ roles: {
+ type: DataTypes.ARRAY(DataTypes.STRING),
+ allowNull: false
+ }
+ },
+ { sequelize }
+ );
+ }
+}
diff --git a/src/lib/models/index.ts b/src/lib/models/index.ts
index 8eb817e..e38ad69 100644
--- a/src/lib/models/index.ts
+++ b/src/lib/models/index.ts
@@ -1,5 +1,7 @@
+export * from './Ban';
export * from './BaseModel';
+export * from './Global';
export * from './Guild';
-export * from './Ban';
-export * from './Modlog';
export * from './Level';
+export * from './Modlog';
+export * from './StickyRole';
diff --git a/src/lib/utils/BushConstants.ts b/src/lib/utils/BushConstants.ts
index 701f818..1015229 100644
--- a/src/lib/utils/BushConstants.ts
+++ b/src/lib/utils/BushConstants.ts
@@ -311,7 +311,8 @@ export class BushConstants {
GUILD: 'guild',
DM: 'dm',
AUTHOR_NOT_FOUND: 'authorNotFound',
- DISABLED: 'disabled',
+ DISABLED_GUILD: 'disabledGuild',
+ DISABLED_GLOBAL: 'disabledGlobal',
ROLE_BLACKLIST: 'roleBlacklist',
USER_BLACKLIST: 'userBlacklist',
RESTRICTED_GUILD: 'restrictedGuild',
@@ -340,4 +341,32 @@ export class BushConstants {
SLASH_NOT_FOUND: 'slashNotFound',
SLASH_MISSING_PERMISSIONS: 'slashMissingPermissions'
};
+
+ public static moulberryBushRoleMap = [
+ { name: '*', id: '792453550768390194' },
+ { name: 'Admin Perms', id: '746541309853958186' },
+ { name: 'Sr. Moderator', id: '782803470205190164' },
+ { name: 'Moderator', id: '737308259823910992' },
+ { name: 'Helper', id: '737440116230062091' },
+ { name: 'Trial Helper', id: '783537091946479636' },
+ { name: 'Contributor', id: '694431057532944425' },
+ { name: 'Giveaway Donor', id: '784212110263451649' },
+ { name: 'Giveaway (200m)', id: '810267756426690601' },
+ { name: 'Giveaway (100m)', id: '801444430522613802' },
+ { name: 'Giveaway (50m)', id: '787497512981757982' },
+ { name: 'Giveaway (25m)', id: '787497515771232267' },
+ { name: 'Giveaway (10m)', id: '787497518241153025' },
+ { name: 'Giveaway (5m)', id: '787497519768403989' },
+ { name: 'Giveaway (1m)', id: '787497521084891166' },
+ { name: 'Suggester', id: '811922322767609877' },
+ { name: 'Partner', id: '767324547312779274' },
+ { name: 'Level Locked', id: '784248899044769792' },
+ { name: 'No Files', id: '786421005039173633' },
+ { name: 'No Reactions', id: '786421270924361789' },
+ { name: 'No Links', id: '786421269356740658' },
+ { name: 'No Bots', id: '786804858765312030' },
+ { name: 'No VC', id: '788850482554208267' },
+ { name: 'No Giveaways', id: '808265422334984203' },
+ { name: 'No Support', id: '790247359824396319' }
+ ];
}
diff --git a/src/lib/utils/BushLogger.ts b/src/lib/utils/BushLogger.ts
index d48ec07..2225bde 100644
--- a/src/lib/utils/BushLogger.ts
+++ b/src/lib/utils/BushLogger.ts
@@ -85,7 +85,7 @@ export class BushLogger {
*/
public debug(...content: any): void {
if (!this.client.config.dev) return;
- console.log(`${chalk.bgGrey(this.getTimeStamp())} ${chalk.grey('[Debug]')}`, ...content);
+ console.log(`${chalk.bgMagenta(this.getTimeStamp())} ${chalk.magenta('[Debug]')}`, ...content);
}
/**
@@ -102,7 +102,7 @@ export class BushLogger {
);
if (!sendChannel) return;
const embed = new MessageEmbed()
- .setDescription(`**[${header}]** ${this.stripColor(newContent)}`)
+ .setDescription(`**[${header}]** ${this.parseFormatting(this.stripColor(newContent), '', true)}`)
.setColor(this.client.util.colors.gray)
.setTimestamp();
this.channelLog({ embeds: [embed] });
@@ -163,7 +163,7 @@ export class BushLogger {
);
if (!sendChannel) return;
const embed = new MessageEmbed()
- .setDescription(`**[${header}]** ${this.stripColor(newContent)}`)
+ .setDescription(`**[${header}]** ${this.parseFormatting(this.stripColor(newContent), '', true)}`)
.setColor(this.client.util.colors.error)
.setTimestamp();
this.channelError({ embeds: [embed] });
@@ -183,7 +183,7 @@ export class BushLogger {
);
if (!sendChannel) return;
const embed = new MessageEmbed()
- .setDescription(`**[${header}]** ${this.stripColor(newContent)}`)
+ .setDescription(`**[${header}]** ${this.parseFormatting(this.stripColor(newContent), '', true)}`)
.setColor(this.client.util.colors.success)
.setTimestamp();
await this.channelLog({ embeds: [embed] }).catch(() => {});
diff --git a/src/lib/utils/CanvasProgressBar.ts b/src/lib/utils/CanvasProgressBar.ts
new file mode 100644
index 0000000..aa8630a
--- /dev/null
+++ b/src/lib/utils/CanvasProgressBar.ts
@@ -0,0 +1,78 @@
+// I just copy pasted this code from stackoverflow don't yell at me if there is issues for it
+export class CanvasProgressBar {
+ private x: number;
+ private y: number;
+ private w: number;
+ private h: number;
+ private color: string;
+ private percentage: number;
+ private p: number;
+ private ctx: CanvasRenderingContext2D;
+
+ constructor(
+ ctx: CanvasRenderingContext2D,
+ dimension: { x: number; y: number; width: number; height: number },
+ color: string,
+ percentage: number
+ ) {
+ ({ x: this.x, y: this.y, width: this.w, height: this.h } = dimension);
+ this.color = color;
+ this.percentage = percentage;
+ this.p;
+ this.ctx = ctx;
+ }
+
+ draw(): void {
+ // -----------------
+ this.p = this.percentage * this.w;
+ if (this.p <= this.h) {
+ this.ctx.beginPath();
+ this.ctx.arc(
+ this.h / 2 + this.x,
+ this.h / 2 + this.y,
+ this.h / 2,
+ Math.PI - Math.acos((this.h - this.p) / this.h),
+ Math.PI + Math.acos((this.h - this.p) / this.h)
+ );
+ this.ctx.save();
+ this.ctx.scale(-1, 1);
+ this.ctx.arc(
+ this.h / 2 - this.p - this.x,
+ this.h / 2 + this.y,
+ this.h / 2,
+ Math.PI - Math.acos((this.h - this.p) / this.h),
+ Math.PI + Math.acos((this.h - this.p) / this.h)
+ );
+ this.ctx.restore();
+ this.ctx.closePath();
+ } else {
+ this.ctx.beginPath();
+ this.ctx.arc(this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, Math.PI / 2, (3 / 2) * Math.PI);
+ this.ctx.lineTo(this.p - this.h + this.x, 0 + this.y);
+ this.ctx.arc(this.p - this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, (3 / 2) * Math.PI, Math.PI / 2);
+ this.ctx.lineTo(this.h / 2 + this.x, this.h + this.y);
+ this.ctx.closePath();
+ }
+ this.ctx.fillStyle = this.color;
+ this.ctx.fill();
+ }
+
+ // showWholeProgressBar(){
+ // this.ctx.beginPath();
+ // this.ctx.arc(this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, Math.PI / 2, 3 / 2 * Math.PI);
+ // this.ctx.lineTo(this.w - this.h + this.x, 0 + this.y);
+ // this.ctx.arc(this.w - this.h / 2 + this.x, this.h / 2 + this.y, this.h / 2, 3 / 2 *Math.PI, Math.PI / 2);
+ // this.ctx.lineTo(this.h / 2 + this.x, this.h + this.y);
+ // this.ctx.strokeStyle = '#000000';
+ // this.ctx.stroke();
+ // this.ctx.closePath();
+ // }
+
+ get PPercentage(): number {
+ return this.percentage * 100;
+ }
+
+ set PPercentage(x: number) {
+ this.percentage = x / 100;
+ }
+}