These were meant to be pushed in 0a1797700c but git had other ideas

This commit is contained in:
Toastie 2025-03-29 20:43:32 +13:00
parent 0a1797700c
commit d96039d20c
Signed by: toastie_t0ast
GPG key ID: 0861BE54AD481DC7
6 changed files with 517 additions and 121 deletions

View file

@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace EllieBot.Migrations.PostgreSql
{
[DbContext(typeof(PostgreSqlContext))]
[Migration("20250328080459_init")]
[Migration("20250327001912_init")]
partial class init
{
/// <inheritdoc />
@ -867,57 +867,6 @@ namespace EllieBot.Migrations.PostgreSql
b.ToTable("discorduser", (string)null);
});
modelBuilder.Entity("EllieBot.Db.Models.EllieExpression", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AllowTarget")
.HasColumnType("boolean")
.HasColumnName("allowtarget");
b.Property<bool>("AutoDeleteTrigger")
.HasColumnType("boolean")
.HasColumnName("autodeletetrigger");
b.Property<bool>("ContainsAnywhere")
.HasColumnType("boolean")
.HasColumnName("containsanywhere");
b.Property<DateTime?>("DateAdded")
.HasColumnType("timestamp without time zone")
.HasColumnName("dateadded");
b.Property<bool>("DmResponse")
.HasColumnType("boolean")
.HasColumnName("dmresponse");
b.Property<decimal?>("GuildId")
.HasColumnType("numeric(20,0)")
.HasColumnName("guildid");
b.Property<string>("Reactions")
.HasColumnType("text")
.HasColumnName("reactions");
b.Property<string>("Response")
.HasColumnType("text")
.HasColumnName("response");
b.Property<string>("Trigger")
.HasColumnType("text")
.HasColumnName("trigger");
b.HasKey("Id")
.HasName("pk_expressions");
b.ToTable("expressions", (string)null);
});
modelBuilder.Entity("EllieBot.Db.Models.FeedSub", b =>
{
b.Property<int>("Id")
@ -1862,6 +1811,57 @@ namespace EllieBot.Migrations.PostgreSql
b.ToTable("ncpixel", (string)null);
});
modelBuilder.Entity("EllieBot.Db.Models.EllieExpression", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AllowTarget")
.HasColumnType("boolean")
.HasColumnName("allowtarget");
b.Property<bool>("AutoDeleteTrigger")
.HasColumnType("boolean")
.HasColumnName("autodeletetrigger");
b.Property<bool>("ContainsAnywhere")
.HasColumnType("boolean")
.HasColumnName("containsanywhere");
b.Property<DateTime?>("DateAdded")
.HasColumnType("timestamp without time zone")
.HasColumnName("dateadded");
b.Property<bool>("DmResponse")
.HasColumnType("boolean")
.HasColumnName("dmresponse");
b.Property<decimal?>("GuildId")
.HasColumnType("numeric(20,0)")
.HasColumnName("guildid");
b.Property<string>("Reactions")
.HasColumnType("text")
.HasColumnName("reactions");
b.Property<string>("Response")
.HasColumnType("text")
.HasColumnName("response");
b.Property<string>("Trigger")
.HasColumnType("text")
.HasColumnName("trigger");
b.HasKey("Id")
.HasName("pk_expressions");
b.ToTable("expressions", (string)null);
});
modelBuilder.Entity("EllieBot.Db.Models.Notify", b =>
{
b.Property<int>("Id")
@ -2988,6 +2988,52 @@ namespace EllieBot.Migrations.PostgreSql
b.ToTable("unroletimer", (string)null);
});
modelBuilder.Entity("EllieBot.Db.Models.UserQuest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<DateTime>("DateAssigned")
.HasColumnType("timestamp without time zone")
.HasColumnName("dateassigned");
b.Property<bool>("IsCompleted")
.HasColumnType("boolean")
.HasColumnName("iscompleted");
b.Property<int>("Progress")
.HasColumnType("integer")
.HasColumnName("progress");
b.Property<int>("QuestId")
.HasColumnType("integer")
.HasColumnName("questid");
b.Property<int>("QuestNumber")
.HasColumnType("integer")
.HasColumnName("questnumber");
b.Property<decimal>("UserId")
.HasColumnType("numeric(20,0)")
.HasColumnName("userid");
b.HasKey("Id")
.HasName("pk_userquest");
b.HasIndex("UserId")
.HasDatabaseName("ix_userquest_userid");
b.HasIndex("UserId", "QuestNumber", "DateAssigned")
.IsUnique()
.HasDatabaseName("ix_userquest_userid_questnumber_dateassigned");
b.ToTable("userquest", (string)null);
});
modelBuilder.Entity("EllieBot.Db.Models.UserXpStats", b =>
{
b.Property<int>("Id")
@ -3470,6 +3516,48 @@ namespace EllieBot.Migrations.PostgreSql
b.ToTable("xpshopowneditem", (string)null);
});
modelBuilder.Entity("EllieBot.Modules.Games.Fish.Db.UserFishItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<DateTime?>("ExpiresAt")
.HasColumnType("timestamp without time zone")
.HasColumnName("expiresat");
b.Property<bool>("IsEquipped")
.HasColumnType("boolean")
.HasColumnName("isequipped");
b.Property<int>("ItemId")
.HasColumnType("integer")
.HasColumnName("itemid");
b.Property<int>("ItemType")
.HasColumnType("integer")
.HasColumnName("itemtype");
b.Property<decimal>("UserId")
.HasColumnType("numeric(20,0)")
.HasColumnName("userid");
b.Property<int?>("UsesLeft")
.HasColumnType("integer")
.HasColumnName("usesleft");
b.HasKey("Id")
.HasName("pk_userfishitem");
b.HasIndex("UserId")
.HasDatabaseName("ix_userfishitem_userid");
b.ToTable("userfishitem", (string)null);
});
modelBuilder.Entity("EllieBot.Modules.Games.FishCatch", b =>
{
b.Property<int>("Id")
@ -3513,14 +3601,6 @@ namespace EllieBot.Migrations.PostgreSql
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int?>("Bait")
.HasColumnType("integer")
.HasColumnName("bait");
b.Property<int?>("Pole")
.HasColumnType("integer")
.HasColumnName("pole");
b.Property<int>("Skill")
.HasColumnType("integer")
.HasColumnName("skill");
@ -4184,4 +4264,4 @@ namespace EllieBot.Migrations.PostgreSql
#pragma warning restore 612, 618
}
}
}
}

View file

@ -1109,6 +1109,24 @@ namespace EllieBot.Migrations.PostgreSql
table.PrimaryKey("pk_userbetstats", x => x.id);
});
migrationBuilder.CreateTable(
name: "userfishitem",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
userid = table.Column<decimal>(type: "numeric(20,0)", nullable: false),
itemtype = table.Column<int>(type: "integer", nullable: false),
itemid = table.Column<int>(type: "integer", nullable: false),
isequipped = table.Column<bool>(type: "boolean", nullable: false),
usesleft = table.Column<int>(type: "integer", nullable: true),
expiresat = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("pk_userfishitem", x => x.id);
});
migrationBuilder.CreateTable(
name: "userfishstats",
columns: table => new
@ -1116,15 +1134,31 @@ namespace EllieBot.Migrations.PostgreSql
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
userid = table.Column<decimal>(type: "numeric(20,0)", nullable: false),
skill = table.Column<int>(type: "integer", nullable: false),
pole = table.Column<int>(type: "integer", nullable: true),
bait = table.Column<int>(type: "integer", nullable: true)
skill = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_userfishstats", x => x.id);
});
migrationBuilder.CreateTable(
name: "userquest",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
questnumber = table.Column<int>(type: "integer", nullable: false),
userid = table.Column<decimal>(type: "numeric(20,0)", nullable: false),
questid = table.Column<int>(type: "integer", nullable: false),
progress = table.Column<int>(type: "integer", nullable: false),
iscompleted = table.Column<bool>(type: "boolean", nullable: false),
dateassigned = table.Column<DateTime>(type: "timestamp without time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_userquest", x => x.id);
});
migrationBuilder.CreateTable(
name: "userrole",
columns: table => new
@ -2233,12 +2267,28 @@ namespace EllieBot.Migrations.PostgreSql
columns: new[] { "userid", "game" },
unique: true);
migrationBuilder.CreateIndex(
name: "ix_userfishitem_userid",
table: "userfishitem",
column: "userid");
migrationBuilder.CreateIndex(
name: "ix_userfishstats_userid",
table: "userfishstats",
column: "userid",
unique: true);
migrationBuilder.CreateIndex(
name: "ix_userquest_userid",
table: "userquest",
column: "userid");
migrationBuilder.CreateIndex(
name: "ix_userquest_userid_questnumber_dateassigned",
table: "userquest",
columns: new[] { "userid", "questnumber", "dateassigned" },
unique: true);
migrationBuilder.CreateIndex(
name: "ix_userrole_guildid",
table: "userrole",
@ -2621,9 +2671,15 @@ namespace EllieBot.Migrations.PostgreSql
migrationBuilder.DropTable(
name: "userbetstats");
migrationBuilder.DropTable(
name: "userfishitem");
migrationBuilder.DropTable(
name: "userfishstats");
migrationBuilder.DropTable(
name: "userquest");
migrationBuilder.DropTable(
name: "userrole");
@ -2703,4 +2759,4 @@ namespace EllieBot.Migrations.PostgreSql
name: "discorduser");
}
}
}
}

View file

@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace EllieBot.Migrations.Sqlite
{
[DbContext(typeof(SqliteContext))]
[Migration("20250328080413_init")]
[Migration("20250327001909_init")]
partial class init
{
/// <inheritdoc />
@ -649,44 +649,6 @@ namespace EllieBot.Migrations.Sqlite
b.ToTable("DiscordUser");
});
modelBuilder.Entity("EllieBot.Db.Models.EllieExpression", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("AllowTarget")
.HasColumnType("INTEGER");
b.Property<bool>("AutoDeleteTrigger")
.HasColumnType("INTEGER");
b.Property<bool>("ContainsAnywhere")
.HasColumnType("INTEGER");
b.Property<DateTime?>("DateAdded")
.HasColumnType("TEXT");
b.Property<bool>("DmResponse")
.HasColumnType("INTEGER");
b.Property<ulong?>("GuildId")
.HasColumnType("INTEGER");
b.Property<string>("Reactions")
.HasColumnType("TEXT");
b.Property<string>("Response")
.HasColumnType("TEXT");
b.Property<string>("Trigger")
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Expressions");
});
modelBuilder.Entity("EllieBot.Db.Models.FeedSub", b =>
{
b.Property<int>("Id")
@ -1391,6 +1353,44 @@ namespace EllieBot.Migrations.Sqlite
b.ToTable("NCPixel");
});
modelBuilder.Entity("EllieBot.Db.Models.EllieExpression", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("AllowTarget")
.HasColumnType("INTEGER");
b.Property<bool>("AutoDeleteTrigger")
.HasColumnType("INTEGER");
b.Property<bool>("ContainsAnywhere")
.HasColumnType("INTEGER");
b.Property<DateTime?>("DateAdded")
.HasColumnType("TEXT");
b.Property<bool>("DmResponse")
.HasColumnType("INTEGER");
b.Property<ulong?>("GuildId")
.HasColumnType("INTEGER");
b.Property<string>("Reactions")
.HasColumnType("TEXT");
b.Property<string>("Response")
.HasColumnType("TEXT");
b.Property<string>("Trigger")
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Expressions");
});
modelBuilder.Entity("EllieBot.Db.Models.Notify", b =>
{
b.Property<int>("Id")
@ -2227,6 +2227,40 @@ namespace EllieBot.Migrations.Sqlite
b.ToTable("UnroleTimer");
});
modelBuilder.Entity("EllieBot.Db.Models.UserQuest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime>("DateAssigned")
.HasColumnType("TEXT");
b.Property<bool>("IsCompleted")
.HasColumnType("INTEGER");
b.Property<int>("Progress")
.HasColumnType("INTEGER");
b.Property<int>("QuestId")
.HasColumnType("INTEGER");
b.Property<int>("QuestNumber")
.HasColumnType("INTEGER");
b.Property<ulong>("UserId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("UserId");
b.HasIndex("UserId", "QuestNumber", "DateAssigned")
.IsUnique();
b.ToTable("UserQuest");
});
modelBuilder.Entity("EllieBot.Db.Models.UserXpStats", b =>
{
b.Property<int>("Id")
@ -2582,6 +2616,37 @@ namespace EllieBot.Migrations.Sqlite
b.ToTable("XpShopOwnedItem");
});
modelBuilder.Entity("EllieBot.Modules.Games.Fish.Db.UserFishItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime?>("ExpiresAt")
.HasColumnType("TEXT");
b.Property<bool>("IsEquipped")
.HasColumnType("INTEGER");
b.Property<int>("ItemId")
.HasColumnType("INTEGER");
b.Property<int>("ItemType")
.HasColumnType("INTEGER");
b.Property<ulong>("UserId")
.HasColumnType("INTEGER");
b.Property<int?>("UsesLeft")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("UserFishItem");
});
modelBuilder.Entity("EllieBot.Modules.Games.FishCatch", b =>
{
b.Property<int>("Id")
@ -2613,12 +2678,6 @@ namespace EllieBot.Migrations.Sqlite
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int?>("Bait")
.HasColumnType("INTEGER");
b.Property<int?>("Pole")
.HasColumnType("INTEGER");
b.Property<int>("Skill")
.HasColumnType("INTEGER");
@ -3181,4 +3240,4 @@ namespace EllieBot.Migrations.Sqlite
#pragma warning restore 612, 618
}
}
}
}

View file

@ -1111,6 +1111,24 @@ namespace EllieBot.Migrations.Sqlite
table.PrimaryKey("PK_UserBetStats", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserFishItem",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
UserId = table.Column<ulong>(type: "INTEGER", nullable: false),
ItemType = table.Column<int>(type: "INTEGER", nullable: false),
ItemId = table.Column<int>(type: "INTEGER", nullable: false),
IsEquipped = table.Column<bool>(type: "INTEGER", nullable: false),
UsesLeft = table.Column<int>(type: "INTEGER", nullable: true),
ExpiresAt = table.Column<DateTime>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_UserFishItem", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserFishStats",
columns: table => new
@ -1118,15 +1136,31 @@ namespace EllieBot.Migrations.Sqlite
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
UserId = table.Column<ulong>(type: "INTEGER", nullable: false),
Skill = table.Column<int>(type: "INTEGER", nullable: false),
Pole = table.Column<int>(type: "INTEGER", nullable: true),
Bait = table.Column<int>(type: "INTEGER", nullable: true)
Skill = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_UserFishStats", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserQuest",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
QuestNumber = table.Column<int>(type: "INTEGER", nullable: false),
UserId = table.Column<ulong>(type: "INTEGER", nullable: false),
QuestId = table.Column<int>(type: "INTEGER", nullable: false),
Progress = table.Column<int>(type: "INTEGER", nullable: false),
IsCompleted = table.Column<bool>(type: "INTEGER", nullable: false),
DateAssigned = table.Column<DateTime>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_UserQuest", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserRole",
columns: table => new
@ -2235,12 +2269,28 @@ namespace EllieBot.Migrations.Sqlite
columns: new[] { "UserId", "Game" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_UserFishItem_UserId",
table: "UserFishItem",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_UserFishStats_UserId",
table: "UserFishStats",
column: "UserId",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_UserQuest_UserId",
table: "UserQuest",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_UserQuest_UserId_QuestNumber_DateAssigned",
table: "UserQuest",
columns: new[] { "UserId", "QuestNumber", "DateAssigned" },
unique: true);
migrationBuilder.CreateIndex(
name: "IX_UserRole_GuildId",
table: "UserRole",
@ -2623,9 +2673,15 @@ namespace EllieBot.Migrations.Sqlite
migrationBuilder.DropTable(
name: "UserBetStats");
migrationBuilder.DropTable(
name: "UserFishItem");
migrationBuilder.DropTable(
name: "UserFishStats");
migrationBuilder.DropTable(
name: "UserQuest");
migrationBuilder.DropTable(
name: "UserRole");
@ -2705,4 +2761,4 @@ namespace EllieBot.Migrations.Sqlite
name: "DiscordUser");
}
}
}
}

View file

@ -4114,7 +4114,7 @@
"Usage": [
".fish"
],
"Submodule": "FishCommands",
"Submodule": "FishingCommands",
"Module": "Games",
"Options": null,
"Requirements": []
@ -4129,7 +4129,7 @@
"Usage": [
".fishspot"
],
"Submodule": "FishCommands",
"Submodule": "FishingCommands",
"Module": "Games",
"Options": null,
"Requirements": []
@ -4145,7 +4145,84 @@
"Usage": [
".fishlist"
],
"Submodule": "FishCommands",
"Submodule": "FishingCommands",
"Module": "Games",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".fishshop",
".fishop"
],
"Description": "Opens the fish shop.\nLists all fish items available for sale",
"Usage": [
".fishshop"
],
"Submodule": "FishItemCommands",
"Module": "Games",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".fishbuy",
".fibuy"
],
"Description": "Purchase a fishing item with the specified id.\nAfter purchase the item will appear in your inventory where you can use/equip it.",
"Usage": [
".fishbuy 1"
],
"Submodule": "FishItemCommands",
"Module": "Games",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".fishuse",
".fiuse",
".fiequip",
".fieq",
".fiquip"
],
"Description": "Use a fishing item in your inventory.\nYou can unequip it later, unless its a potion.",
"Usage": [
".fishuse 1"
],
"Submodule": "FishItemCommands",
"Module": "Games",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".fishunequip",
".fiuneq",
".fiunequip",
".fiunuse",
".fishunuse"
],
"Description": "Unequips an item by specifying its index in your inventory.\nYou can use it again later.\nYou can't unequip potions.",
"Usage": [
".fishunequip 1"
],
"Submodule": "FishItemCommands",
"Module": "Games",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".fishinv",
".finv",
".fiinv"
],
"Description": "Opens your fish inventory.\nYour inventory contains all items you've purchased but not spent.",
"Usage": [
".fishinv"
],
"Submodule": "FishItemCommands",
"Module": "Games",
"Options": null,
"Requirements": []
@ -5238,6 +5315,19 @@
"Module": "Owner",
"Options": null,
"Requirements": []
},
{
"Aliases": [
".massping"
],
"Description": "Mass pings all users in the server.\nRun again to cancel.",
"Usage": [
".massping"
],
"Submodule": "Owner",
"Module": "Owner",
"Options": null,
"Requirements": []
}
],
"Permissions": [
@ -5825,6 +5915,23 @@
]
}
],
"QuestCommands": [
{
"Aliases": [
".questlog",
".qlog",
".myquests"
],
"Description": "Shows your active quests and progress.",
"Usage": [
".questlog"
],
"Submodule": "QuestCommands",
"Module": "QuestCommands",
"Options": null,
"Requirements": []
}
],
"Searches": [
{
"Aliases": [
@ -7534,7 +7641,6 @@
".quoteprint",
".qp",
".qup",
"...",
".qprint"
],
"Description": "Prints a random quote with a specified name.",
@ -7599,8 +7705,7 @@
".quoteadd",
".qa",
".qadd",
".quadd",
".."
".quadd"
],
"Description": "Adds a new quote with the specified name and message.",
"Usage": [

View file

@ -42,3 +42,43 @@ trash:
condition:
image: https://cdn.nadeko.bot/fish/plasticbag.png
emoji: <:plasticbag:1328520895454515211>
items:
- id: 1
itemType: Pole
name: "Wooden Rod"
description: "Better than catching it with bare hands."
price: 1000
fishMultiplier: 1.2
- id: 11
itemType: Pole
name: Magnet on a Stick
description: "Attracts all trash, not just metal."
price: 3000
fishMultiplier: 0.9
trashMultiplier: 2
- id: 21
itemType: Bait
name: "Corn"
description: "Just some cooked corn."
price: 100
uses: 100
rareMultiplier: 1.1
- id: 31
itemType: Potion
name: "A Cup of Tea"
description: "Helps you focus."
price: 12000
durationMinutes: 30
maxStarMultiplier: 1.1
fishingSpeedMultiplier: 1.01
- id: 41
itemType: Boat
name: "Canoe"
description: "Lets you fish a little faster."
price: 3000
fishingSpeedMultiplier: 1.201
maxStarMultiplier: 1.1