From fdaaf6c42bff0f74281585f932a941b41b5ed662 Mon Sep 17 00:00:00 2001 From: awencat <2364355319@qq.com> Date: Sun, 12 Jul 2026 13:29:51 +0800 Subject: [PATCH 1/5] allow for git fix #4 --- .idea/.gitignore | 10 ++++++++++ .idea/dataSources.xml | 12 ++++++++++++ .idea/go.imports.xml | 10 ++++++++++ .idea/misc.xml | 6 ++++++ .idea/modules.xml | 8 ++++++++ .idea/necore.iml | 10 ++++++++++ .idea/vcs.xml | 6 ++++++ main.go | 2 +- service/article.go | 1 + 9 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/dataSources.xml create mode 100644 .idea/go.imports.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/necore.iml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..7d05e99 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# 依赖于环境的 Maven 主目录路径 +/mavenHomeManager.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..d1d90ab --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/data/user.sqlite3 + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/go.imports.xml b/.idea/go.imports.xml new file mode 100644 index 0000000..644cdf0 --- /dev/null +++ b/.idea/go.imports.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f03c948 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..35aaf5f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/necore.iml b/.idea/necore.iml new file mode 100644 index 0000000..25ed3f6 --- /dev/null +++ b/.idea/necore.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/main.go b/main.go index 82bb15c..59bf4ca 100644 --- a/main.go +++ b/main.go @@ -10,7 +10,7 @@ import ( func main() { // This will print a hash of "test". U can insert it into sqlite3 manually for an admin account (the group section should be `["admin"]`). - // dao.DebugTestPassword() + //dao.DebugTestPassword() if err := config.Init(); err != nil { log.Fatalf("initialize configuration: %v", err) diff --git a/service/article.go b/service/article.go index 7a869d0..e7f4645 100644 --- a/service/article.go +++ b/service/article.go @@ -31,6 +31,7 @@ func generateStoredFilename(original string) (string, error) { ".webp": true, ".pdf": true, ".txt": true, + ".gif": true, //对gif的支持 } if !allowedExtensions[extension] { From a2c107a1d9c58519030dac849cc74146302513ab Mon Sep 17 00:00:00 2001 From: awencat <2364355319@qq.com> Date: Mon, 13 Jul 2026 23:16:49 +0800 Subject: [PATCH 2/5] enhancement by awencat 1 #9 --- .idea/dataSources.xml | 7 +++++++ .idea/db-forest-config.xml | 10 ++++++++++ 2 files changed, 17 insertions(+) create mode 100644 .idea/db-forest-config.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index d1d90ab..efe8d23 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -8,5 +8,12 @@ jdbc:sqlite:$PROJECT_DIR$/data/user.sqlite3 $ProjectFileDir$ + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/data/bot_connection.sqlite3 + $ProjectFileDir$ + \ No newline at end of file diff --git a/.idea/db-forest-config.xml b/.idea/db-forest-config.xml new file mode 100644 index 0000000..a0005f1 --- /dev/null +++ b/.idea/db-forest-config.xml @@ -0,0 +1,10 @@ + + + + . + ---------------------------------------- + 1:0:5d47aad1-5a7d-4f96-b572-b985303f5818 + 2:0:d11afa88-1e1f-4198-84e8-7048e2d43847 + . + + \ No newline at end of file From 45e531b965c29cd8df2cfb26222b516e1c6efced Mon Sep 17 00:00:00 2001 From: awencat <2364355319@qq.com> Date: Fri, 17 Jul 2026 10:53:28 +0800 Subject: [PATCH 3/5] fix: fix the missing commit --- controller/router/router.go | 16 +++ dao/glossary.go | 61 +++++++++ dao/item.go | 63 +++++++++ database/database.go | 12 ++ model/glossary.go | 13 ++ model/item.go | 15 +++ service/wiki.go | 261 ++++++++++++++++++++++++++++++++++++ 7 files changed, 441 insertions(+) create mode 100644 dao/glossary.go create mode 100644 dao/item.go create mode 100644 model/glossary.go create mode 100644 model/item.go create mode 100644 service/wiki.go diff --git a/controller/router/router.go b/controller/router/router.go index 5539752..585c4dc 100644 --- a/controller/router/router.go +++ b/controller/router/router.go @@ -97,4 +97,20 @@ func SetupRoutes() { botGroup.Delete("/token/:id", middleware.AuthNeeded(), service.DeleteBotToken) botGroup.Get("/status", middleware.AuthNeeded(), service.GetWSStatus) botGroup.Delete("/ws/kick/:session_id", middleware.AuthNeeded(), service.KickConnection) + + wikiGroup := (*router).Group("/wiki") + wikiGroup.Get("/glossary", service.GetGlossaryList) + wikiGroup.Get("/glossary/:id", service.GetGlossaryById) + wikiGroup.Get("/item", service.GetItemList) + wikiGroup.Get("/item/:id", service.GetItemById) + + wikiGroup.Post("/glossary", middleware.AuthNeeded(), service.CreateGlossary) + wikiGroup.Patch("/glossary/:id", middleware.AuthNeeded(), service.UpdateGlossary) + wikiGroup.Delete("/glossary/:id", middleware.AuthNeeded(), service.DeleteGlossary) + wikiGroup.Post("/item", middleware.AuthNeeded(), service.CreateItem) + wikiGroup.Patch("/item/:id", middleware.AuthNeeded(), service.UpdateItem) + wikiGroup.Delete("/item/:id", middleware.AuthNeeded(), service.DeleteItem) + + wikiGroup.Post("/upload/:id", middleware.AuthNeeded(), service.UploadWikiFile) + wikiGroup.Delete("/upload/:id", middleware.AuthNeeded(), service.DeleteWikiFile) } diff --git a/dao/glossary.go b/dao/glossary.go new file mode 100644 index 0000000..800d426 --- /dev/null +++ b/dao/glossary.go @@ -0,0 +1,61 @@ +package dao + +import ( + "fmt" + "necore/database" + "necore/model" +) + +func GetGlossaryList() ([]model.Glossary, error) { + db := database.GetWikiDatabase() + var list []model.Glossary + err := db.Find(&list).Error + return list, err +} + +func GetGlossaryById(id string) (model.Glossary, error) { + db := database.GetWikiDatabase() + var entry model.Glossary + err := db.Where("id = ?", id).First(&entry).Error + return entry, err +} + +func CreateGlossary(entry model.Glossary) error { + db := database.GetWikiDatabase() + return db.Create(&entry).Error +} + +func UpdateGlossary(entry model.Glossary) error { + result := database.GetWikiDatabase(). + Model(&model.Glossary{}). + Where("id = ?", entry.Id). + Updates(map[string]any{ + "name": entry.Name, + "type": entry.Type, + "gallery": entry.Gallery, + "content": entry.Content, + }) + + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("glossary not found") + } + return nil +} + +func DeleteGlossary(id string) error { + result := database.GetWikiDatabase(). + Unscoped(). + Where("id = ?", id). + Delete(&model.Glossary{}) + + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("glossary not found") + } + return nil +} diff --git a/dao/item.go b/dao/item.go new file mode 100644 index 0000000..0f44a1d --- /dev/null +++ b/dao/item.go @@ -0,0 +1,63 @@ +package dao + +import ( + "fmt" + "necore/database" + "necore/model" +) + +func GetItemList() ([]model.Item, error) { + db := database.GetWikiDatabase() + var list []model.Item + err := db.Find(&list).Error + return list, err +} + +func GetItemById(id string) (model.Item, error) { + db := database.GetWikiDatabase() + var entry model.Item + err := db.Where("id = ?", id).First(&entry).Error + return entry, err +} + +func CreateItem(entry model.Item) error { + db := database.GetWikiDatabase() + return db.Create(&entry).Error +} + +func UpdateItem(entry model.Item) error { + result := database.GetWikiDatabase(). + Model(&model.Item{}). + Where("id = ?", entry.Id). + Updates(map[string]any{ + "name": entry.Name, + "type": entry.Type, + "image": entry.Image, + "max_stack": entry.MaxStack, + "recipe": entry.Recipe, + "content": entry.Content, + }) + + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("item not found") + } + return nil +} + +func DeleteItem(id string) error { + result := database.GetWikiDatabase(). + Unscoped(). + Where("id = ?", id). + Delete(&model.Item{}) + + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("item not found") + } + return nil +} diff --git a/database/database.go b/database/database.go index 907cff3..43dbbb5 100644 --- a/database/database.go +++ b/database/database.go @@ -19,6 +19,8 @@ var documentDatabase *gorm.DB var botTokenDatabase *gorm.DB +var wikiDatabase *gorm.DB + func ConnectSqlite() { var err error userDatabase, err = gorm.Open(sqlite.Open("data/user.sqlite3"), &gorm.Config{}) @@ -50,6 +52,12 @@ func ConnectSqlite() { panic("failed to connect bot connection database") } botTokenDatabase.AutoMigrate(&model.BotToken{}) + + wikiDatabase, err = gorm.Open(sqlite.Open("data/wiki.sqlite3"), &gorm.Config{}) + if err != nil { + panic("failed to connect wiki database") + } + wikiDatabase.AutoMigrate(&model.Glossary{}, &model.Item{}) } func GetUserDatabase() *gorm.DB { @@ -71,3 +79,7 @@ func GetDocumentDatabase() *gorm.DB { func GetBotTokenDatabase() *gorm.DB { return botTokenDatabase } + +func GetWikiDatabase() *gorm.DB { + return wikiDatabase +} diff --git a/model/glossary.go b/model/glossary.go new file mode 100644 index 0000000..329761c --- /dev/null +++ b/model/glossary.go @@ -0,0 +1,13 @@ +package model + +import "gorm.io/gorm" + +type Glossary struct { + gorm.Model + + Id string `gorm:"uniqueIndex;not null" json:"id"` + Name string `gorm:"not null" json:"name"` + Type string `json:"type"` + Gallery string `json:"gallery"` + Content string `json:"content"` +} diff --git a/model/item.go b/model/item.go new file mode 100644 index 0000000..0f9f104 --- /dev/null +++ b/model/item.go @@ -0,0 +1,15 @@ +package model + +import "gorm.io/gorm" + +type Item struct { + gorm.Model + + Id string `gorm:"uniqueIndex;not null" json:"id"` + Name string `gorm:"not null" json:"name"` + Type string `json:"type"` + Image string `json:"image"` + MaxStack int `json:"maxStack"` + Recipe string `json:"recipe"` + Content string `json:"content"` +} diff --git a/service/wiki.go b/service/wiki.go new file mode 100644 index 0000000..209a24a --- /dev/null +++ b/service/wiki.go @@ -0,0 +1,261 @@ +package service + +import ( + "errors" + "fmt" + "necore/dao" + "necore/model" + "necore/util" + "os" + + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" +) + +func checkWikiPermission(c *fiber.Ctx) bool { + user := c.Locals("currentUser").(model.User) + isAdmin := dao.ContainsGroup(user.Group, "admin") + isDocsAdmin := dao.ContainsGroup(user.Group, "document_admin") + return isAdmin || isDocsAdmin +} + +// ---- Glossary handlers ---- + +func GetGlossaryList(c *fiber.Ctx) error { + list, err := dao.GetGlossaryList() + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + if list == nil { + list = make([]model.Glossary, 0) + } + return c.JSON(fiber.Map{ + "glossaries": list, + }) +} + +func GetGlossaryById(c *fiber.Ctx) error { + entry, err := dao.GetGlossaryById(c.Params("id")) + if err != nil { + return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ + "error": "glossary not found", + }) + } + return c.JSON(entry) +} + +func CreateGlossary(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "You don't have permission to create glossary", + }) + } + id := uuid.New().String() + entry := model.Glossary{Id: id} + if err := c.BodyParser(&entry); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid request", + }) + } + entry.Id = id + if err := dao.CreateGlossary(entry); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + return c.JSON(fiber.Map{ + "id": id, + }) +} + +func UpdateGlossary(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "You don't have permission to update glossary", + }) + } + var entry model.Glossary + if err := c.BodyParser(&entry); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid request", + }) + } + entry.Id = c.Params("id") + if err := dao.UpdateGlossary(entry); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + return c.SendStatus(fiber.StatusOK) +} + +func DeleteGlossary(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "You don't have permission to delete glossary", + }) + } + if err := dao.DeleteGlossary(c.Params("id")); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + return c.SendStatus(fiber.StatusOK) +} + +// ---- Item handlers ---- + +func GetItemList(c *fiber.Ctx) error { + list, err := dao.GetItemList() + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + if list == nil { + list = make([]model.Item, 0) + } + return c.JSON(fiber.Map{ + "items": list, + }) +} + +func GetItemById(c *fiber.Ctx) error { + entry, err := dao.GetItemById(c.Params("id")) + if err != nil { + return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ + "error": "item not found", + }) + } + return c.JSON(entry) +} + +func CreateItem(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "You don't have permission to create item", + }) + } + id := uuid.New().String() + entry := model.Item{Id: id} + if err := c.BodyParser(&entry); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid request", + }) + } + entry.Id = id + if err := dao.CreateItem(entry); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + return c.JSON(fiber.Map{ + "id": id, + }) +} + +func UpdateItem(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "You don't have permission to update item", + }) + } + var entry model.Item + if err := c.BodyParser(&entry); err != nil { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ + "error": "Invalid request", + }) + } + entry.Id = c.Params("id") + if err := dao.UpdateItem(entry); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + return c.SendStatus(fiber.StatusOK) +} + +func DeleteItem(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "You don't have permission to delete item", + }) + } + if err := dao.DeleteItem(c.Params("id")); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + return c.SendStatus(fiber.StatusOK) +} + +// ---- File upload for wiki ---- + +func generateWikiStoredFilename(originalName string) (string, error) { + return generateStoredFilename(originalName) +} + +func UploadWikiFile(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "Forbidden", + }) + } + id := c.Params("id") + file, err := c.FormFile("file") + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": err.Error(), + }) + } + dir := fmt.Sprintf("./contents/wiki/%s", id) + if err := os.MkdirAll(dir, 0o750); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) + } + storedName, err := generateWikiStoredFilename(file.Filename) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) + } + contentPath, err := util.SafeContentPath("./contents/wiki", id, storedName) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) + } + if err := c.SaveFile(file, contentPath); err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()}) + } + return c.JSON(fiber.Map{"url": fmt.Sprintf("/contents/wiki/%s/%s", id, storedName)}) +} + +func DeleteWikiFile(c *fiber.Ctx) error { + if !checkWikiPermission(c) { + return c.Status(fiber.StatusForbidden). + JSON(fiber.Map{"error": "Forbidden"}) + } + id := c.Params("id") + type Payload struct { + Filename string `json:"filename"` + } + var payload Payload + if err := c.BodyParser(&payload); err != nil { + return c.Status(fiber.StatusBadRequest). + JSON(fiber.Map{"error": "Invalid request body"}) + } + target, err := util.SafeContentPath("./contents/wiki", id, payload.Filename) + if err != nil { + return c.Status(fiber.StatusBadRequest). + JSON(fiber.Map{"error": "Invalid filename"}) + } + if err := os.Remove(target); err != nil { + if errors.Is(err, os.ErrNotExist) { + return c.Status(fiber.StatusNotFound). + JSON(fiber.Map{"error": "File not found"}) + } + return c.Status(fiber.StatusInternalServerError). + JSON(fiber.Map{"error": "Internal server error"}) + } + return c.SendStatus(fiber.StatusNoContent) +} + +// generateStoredFilename is shared from article.go in the same package. From 6bcbf7faafcea002e39a1b6b57083d279e2c5b95 Mon Sep 17 00:00:00 2001 From: awencat <2364355319@qq.com> Date: Fri, 17 Jul 2026 10:56:15 +0800 Subject: [PATCH 4/5] fix: ignore the .idea --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a6b26e4..5327bce 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,6 @@ necore # dotenv .env .env.* -!.env.example \ No newline at end of file +!.env.example + +.idea/ \ No newline at end of file From 5382c2bddbe3d225787a4c018699184540039a90 Mon Sep 17 00:00:00 2001 From: awencat <2364355319@qq.com> Date: Fri, 17 Jul 2026 21:02:51 +0800 Subject: [PATCH 5/5] chore: stop tracking .idea folder --- .idea/.gitignore | 10 ---------- .idea/dataSources.xml | 19 ------------------- .idea/db-forest-config.xml | 10 ---------- .idea/go.imports.xml | 10 ---------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/necore.iml | 10 ---------- .idea/vcs.xml | 6 ------ 8 files changed, 79 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/db-forest-config.xml delete mode 100644 .idea/go.imports.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/necore.iml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 7d05e99..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# 依赖于环境的 Maven 主目录路径 -/mavenHomeManager.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index efe8d23..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/data/user.sqlite3 - $ProjectFileDir$ - - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/data/bot_connection.sqlite3 - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/db-forest-config.xml b/.idea/db-forest-config.xml deleted file mode 100644 index a0005f1..0000000 --- a/.idea/db-forest-config.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - . - ---------------------------------------- - 1:0:5d47aad1-5a7d-4f96-b572-b985303f5818 - 2:0:d11afa88-1e1f-4198-84e8-7048e2d43847 - . - - \ No newline at end of file diff --git a/.idea/go.imports.xml b/.idea/go.imports.xml deleted file mode 100644 index 644cdf0..0000000 --- a/.idea/go.imports.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index f03c948..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 35aaf5f..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/necore.iml b/.idea/necore.iml deleted file mode 100644 index 25ed3f6..0000000 --- a/.idea/necore.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file