aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVidhu Kant Sharma <vidhukant@protonmail.ch>2022-02-16 22:43:23 +0530
committerVidhu Kant Sharma <vidhukant@protonmail.ch>2022-02-16 22:43:23 +0530
commit5c94f2f8e7026b9a4dff874edbf3b4fa3b266516 (patch)
treea4c0a4650a94859eb256204dec25aa04ac8caf15
parent3269df237abce92172e115aa62e9c5d6e4652765 (diff)
Defined different functions to update different anime fields
-rw-r--r--go.mod4
-rw-r--r--go.sum2
-rw-r--r--user/anime/animelist.go34
-rw-r--r--user/anime/animelist.structs.go2
-rw-r--r--user/anime/request_handler.go28
-rw-r--r--user/anime/update_animelist.go203
6 files changed, 219 insertions, 54 deletions
diff --git a/go.mod b/go.mod
index 5fe48c9..5bf033b 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,5 @@
-module github.com/MikunoNaka/mal2go
+module github.com/MikunoNaka/MAL2Go
go 1.17
+
+require github.com/MikunoNaka/mal2go v0.0.0-20220213112712-541c75949e86
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..8148e90
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,2 @@
+github.com/MikunoNaka/mal2go v0.0.0-20220213112712-541c75949e86 h1:hpz3DsUPkaznnO3a1nZZTQeIll0yKTGGWKM0fxvnCxc=
+github.com/MikunoNaka/mal2go v0.0.0-20220213112712-541c75949e86/go.mod h1:fKunJNVMPoiH/yahvQDy9cFdjRkL+w+DDzeOlL4lMEU=
diff --git a/user/anime/animelist.go b/user/anime/animelist.go
index 3065919..bbc7d7a 100644
--- a/user/anime/animelist.go
+++ b/user/anime/animelist.go
@@ -1,4 +1,4 @@
-/* mal2go - MyAnimeList V2 API wrapper for Go
+/* MAL2Go - MyAnimeList V2 API wrapper for Go
* Copyright (C) 2022 Vidhu Kant Sharma <vidhukant@protonmail.ch>
* This program is free software: you can redistribute it and/or modify
@@ -29,43 +29,15 @@ const BASE_URL string = "https://api.myanimelist.net/v2"
const maxListLimit int = 1000
// Delete an anime from user's anime list
-func (c AnimeListClient)DeleteAnime(id int) string {
+func (c Client)DeleteAnime(id int) string {
endpoint := fmt.Sprintf("%s/anime/%d/my_list_status", BASE_URL, id)
/* Returns 200 if anime successfully deleted
* Alternatively returns 404 if anime not in user's anime list */
return c.requestHandler(endpoint, "DELETE")
}
-// Update/Add an anime to user's anime list
-func (c AnimeListClient)UpdateAnime(id int, data UpdateAnimeData) (serverResponse, error) {
- endpoint := fmt.Sprintf("%s/anime/%d/my_list_status", BASE_URL, id)
-
- // checks if specified list status is valid
- if !e.IsValidListStatus(data.Status) {
- return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid list status: \"%s\"", data.Status))
- }
-
- // checks if specified score is valid
- if !e.IsValidScore(data.Score) {
- return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid score: %d doesn't lie within 0-10", data.Score))
- }
-
- // checks if specified priority is valid
- if !e.IsValidPriority(data.Priority) {
- return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid priority: %d doesn't lie within 0-2", data.Priority))
- }
-
- // checks if specified rewatch value is valid
- if !e.IsValidRewatchValue(data.RewatchValue) {
- return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid rewatch value: %d doesn't lie within 0-5", data.RewatchValue))
- }
-
- // make API request
- return c.putRequestHandler(endpoint, data), nil
-}
-
// Get authenticated user's anime list
-func (c AnimeListClient) GetAnimeList(user, status, sort string, limit, offset int) (a.AnimeList, error){
+func (c Client) GetAnimeList(user, status, sort string, limit, offset int) (a.AnimeList, error){
var userAnimeList a.AnimeList
// error handling for limit and offset
limitsErr := e.LimitsErrHandler(limit, offset, maxListLimit)
diff --git a/user/anime/animelist.structs.go b/user/anime/animelist.structs.go
index 06c40d1..cee47d2 100644
--- a/user/anime/animelist.structs.go
+++ b/user/anime/animelist.structs.go
@@ -1,4 +1,4 @@
-/* mal2go - MyAnimeList V2 API wrapper for Go
+/* MAL2Go - MyAnimeList V2 API wrapper for Go
* Copyright (C) 2022 Vidhu Kant Sharma <vidhukant@protonmail.ch>
* This program is free software: you can redistribute it and/or modify
diff --git a/user/anime/request_handler.go b/user/anime/request_handler.go
index e44dab1..abc0afc 100644
--- a/user/anime/request_handler.go
+++ b/user/anime/request_handler.go
@@ -1,4 +1,4 @@
-/* mal2go - MyAnimeList V2 API wrapper for Go
+/* MAL2Go - MyAnimeList V2 API wrapper for Go
* Copyright (C) 2022 Vidhu Kant Sharma <vidhukant@protonmail.ch>
* This program is free software: you can redistribute it and/or modify
@@ -16,13 +16,13 @@
package anime
import (
- "strings"
"encoding/json"
- "net/url"
"io/ioutil"
"log"
"net/http"
+ "net/url"
"strconv"
+ "strings"
)
type serverResponse struct {
@@ -31,7 +31,7 @@ type serverResponse struct {
}
// Handles HTTP request with your OAuth token as a Header
-func (c AnimeListClient) requestHandler(endpoint, method string) string {
+func (c Client) requestHandler(endpoint, method string) string {
// generate request
req, err := http.NewRequest(method, endpoint, nil)
if err != nil {
@@ -60,23 +60,8 @@ func (c AnimeListClient) requestHandler(endpoint, method string) string {
return string(body)
}
-// for PUT requests (used by UpdateAnime)
-func (c AnimeListClient) putRequestHandler(endpoint string, updateData UpdateAnimeData) serverResponse {
- // TODO: make this do other stuff
- params := url.Values{}
-
- /* NOTE: THIS WILL OVERWRITE ANY DATA THAT
- * IS NOT SPECIFIED AND SET IT TO NULL */
- params.Set("status", updateData.Status)
- params.Set("is_rewatching", strconv.FormatBool(updateData.IsRewatching))
- params.Set("score", strconv.Itoa(updateData.Score))
- params.Set("num_watched_episodes", strconv.Itoa(updateData.EpWatched))
- params.Set("priority", strconv.Itoa(updateData.Priority))
- params.Set("num_times_rewatched", strconv.Itoa(updateData.TimesRewatched))
- params.Set("rewatch_value", strconv.Itoa(updateData.RewatchValue))
- params.Set("tags", updateData.Tags)
- params.Set("comments", updateData.Comments)
-
+// for PUT requests (used for updating anime)
+func (c Client) putRequestHandler(endpoint string, params url.Values) serverResponse {
paramsEncoded := params.Encode()
// generate request
@@ -102,6 +87,7 @@ func (c AnimeListClient) putRequestHandler(endpoint string, updateData UpdateAni
log.Fatal(err)
}
+ // TODO: there are other serverResponses. Add them
// server response, ie message / error
var resp serverResponse
json.Unmarshal(body, &resp)
diff --git a/user/anime/update_animelist.go b/user/anime/update_animelist.go
new file mode 100644
index 0000000..5a6883c
--- /dev/null
+++ b/user/anime/update_animelist.go
@@ -0,0 +1,203 @@
+/* MAL2Go - MyAnimeList V2 API wrapper for Go
+ * Copyright (C) 2022 Vidhu Kant Sharma <vidhukant@protonmail.ch>
+
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+package anime
+
+import (
+ e "github.com/MikunoNaka/mal2go/errhandlers"
+ "errors"
+ "fmt"
+ "net/url"
+ "strconv"
+)
+
+// generate the endpoint url with the anime id
+func endpointGenerator(id int) string {
+ return fmt.Sprintf("%s/anime/%d/my_list_status", BASE_URL, id)
+}
+
+// update just an anime's status
+func (c Client)SetStatus(id int, status string) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // checks if specified list status is valid
+ if !e.IsValidListStatus(status) {
+ return serverResponse{}, errors.New(fmt.Sprintf("SetStatus: Invalid list status: \"%s\"", status))
+ }
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("status", status)
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's num of episodes watched
+func (c Client)SetWatchedEpisodes(id int, episodesWatched int) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("num_watched_episodes", strconv.Itoa(episodesWatched))
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's rewatching status
+func (c Client)SetIsRewatching(id int, isRewatching bool) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("is_rewatching", strconv.FormatBool(isRewatching))
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just the anime's score
+func (c Client)SetScore(id int, score int) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // checks if specified score is valid
+ if !e.IsValidScore(score) {
+ return serverResponse{}, errors.New(fmt.Sprintf("SetScore: Invalid score: %d doesn't lie within 0-10", score))
+ }
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("score", strconv.Itoa(score))
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's priority
+func (c Client)SetPriority(id int, priority int) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // checks if specified priority is valid
+ if !e.IsValidPriority(priority) {
+ return serverResponse{}, errors.New(fmt.Sprintf("SetPriority: Invalid priority: %d doesn't lie within 0-2", priority))
+ }
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("priority", strconv.Itoa(priority))
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's rewatch value
+func (c Client)SetRewatchValue(id int, rewatchValue int) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // checks if specified rewatch value is valid
+ if !e.IsValidRewatchValue(rewatchValue) {
+ return serverResponse{}, errors.New(fmt.Sprintf("SetRewatchValue: Invalid rewatch value: %d doesn't lie within 0-5", rewatchValue))
+ }
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("rewatch_value", strconv.Itoa(rewatchValue))
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's rewatch count
+func (c Client)UpdateRewatchCount(id int, rewatchCount int) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("num_times_rewatched", strconv.Itoa(rewatchCount))
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's tags
+func (c Client)UpdateTags(id int, tags string) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("tags", tags)
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+// update just an anime's comments
+func (c Client)UpdateComments(id int, comments string) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // data to be sent to the server
+ params := url.Values{}
+ params.Set("comments", comments)
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+
+/* This will overwrite everything
+ * i won't use it.. but it's pretty flexible
+ * so this will stay here */
+// Update/Add an anime to user's anime list
+func (c Client)UpdateAnime(id int, data UpdateAnimeData) (serverResponse, error) {
+ endpoint := endpointGenerator(id)
+
+ // checks if specified list status is valid
+ if !e.IsValidListStatus(data.Status) {
+ return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid list status: \"%s\"", data.Status))
+ }
+
+ // checks if specified score is valid
+ if !e.IsValidScore(data.Score) {
+ return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid score: %d doesn't lie within 0-10", data.Score))
+ }
+
+ // checks if specified priority is valid
+ if !e.IsValidPriority(data.Priority) {
+ return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid priority: %d doesn't lie within 0-2", data.Priority))
+ }
+
+ // checks if specified rewatch value is valid
+ if !e.IsValidRewatchValue(data.RewatchValue) {
+ return serverResponse{}, errors.New(fmt.Sprintf("UpdateAnime: Invalid rewatch value: %d doesn't lie within 0-5", data.RewatchValue))
+ }
+
+ params := url.Values{}
+
+ /* NOTE: THIS WILL OVERWRITE ANY DATA THAT
+ * IS NOT SPECIFIED AND SET IT TO NULL */
+ params.Set("status", data.Status)
+ params.Set("is_rewatching", strconv.FormatBool(data.IsRewatching))
+ params.Set("score", strconv.Itoa(data.Score))
+ params.Set("num_watched_episodes", strconv.Itoa(data.EpWatched))
+ params.Set("priority", strconv.Itoa(data.Priority))
+ params.Set("num_times_rewatched", strconv.Itoa(data.TimesRewatched))
+ params.Set("rewatch_value", strconv.Itoa(data.RewatchValue))
+ params.Set("tags", data.Tags)
+ params.Set("comments", data.Comments)
+
+ // make API request
+ return c.putRequestHandler(endpoint, params), nil
+}
+