Skip to content

Commit b5d6ecc

Browse files
committed
question - university
1 parent 8bf8e16 commit b5d6ecc

File tree

11 files changed

+197
-4
lines changed

11 files changed

+197
-4
lines changed

injector/injector.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ import (
77
"github.com/google/wire"
88
delivery "github.com/verdex-id/verdex-bot/internal/app/delivery/discord"
99
"github.com/verdex-id/verdex-bot/internal/app/delivery/discord/event"
10+
"github.com/verdex-id/verdex-bot/internal/app/service"
1011
)
1112

1213
func InjectDeliveryDiscord() *delivery.DiscordDelivery {
1314
wire.Build(
15+
service.NewPDDIKTIService,
1416
event.NewDiscordEventHandler,
1517
delivery.NewDiscordDelivery,
1618
)

injector/wire_gen.go

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/app/delivery/discord/discord.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ func NewDiscordDelivery(discordEventHandler *event.DiscordEventHandler) *Discord
3232
func (d *DiscordDelivery) RegisterEvents() {
3333
d.Session.AddHandler(d.DiscordEventHandler.Ready)
3434
d.Session.AddHandler(d.DiscordEventHandler.MemberAdd)
35+
d.Session.AddHandler(d.DiscordEventHandler.QuestionUniversityCommand)
3536
}
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
11
package event
22

3+
import (
4+
"github.com/bwmarrin/discordgo"
5+
"github.com/verdex-id/verdex-bot/internal/app/service"
6+
)
7+
38
type DiscordEventHandler struct {
9+
PDDIKTIService *service.PDDIKTIService
10+
}
11+
12+
func NewDiscordEventHandler(pddiktiService *service.PDDIKTIService) *DiscordEventHandler {
13+
return &DiscordEventHandler{
14+
PDDIKTIService: pddiktiService,
15+
}
416
}
517

6-
func NewDiscordEventHandler() *DiscordEventHandler {
7-
return &DiscordEventHandler{}
18+
func (h *DiscordEventHandler) IsAdmin(s *discordgo.Session, user *discordgo.User, channelID string) bool {
19+
perms, _ := s.State.UserChannelPermissions(user.ID, channelID)
20+
21+
return perms&discordgo.PermissionAdministrator != 0
822
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package event
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/bwmarrin/discordgo"
8+
"github.com/spf13/viper"
9+
)
10+
11+
func (h *DiscordEventHandler) QuestionUniversityCommand(s *discordgo.Session, msg *discordgo.MessageCreate) {
12+
if msg.Content != "!question university" {
13+
return
14+
}
15+
16+
if !h.IsAdmin(s, msg.Author, msg.ChannelID) {
17+
s.ChannelMessageSendComplex(msg.ChannelID, &discordgo.MessageSend{
18+
Content: "Kamu tidak memiliki akses untuk perintah ini!",
19+
Reference: msg.Reference(),
20+
Flags: discordgo.MessageFlagsEphemeral,
21+
})
22+
return
23+
}
24+
25+
universities, err := h.PDDIKTIService.GetManyUniversity(1)
26+
if err != nil {
27+
s.ChannelMessageSendComplex(msg.ChannelID, &discordgo.MessageSend{
28+
Content: "Error: " + err.Error(),
29+
Reference: msg.Reference(),
30+
Flags: discordgo.MessageFlagsEphemeral,
31+
})
32+
return
33+
}
34+
35+
embed := &discordgo.MessageEmbed{
36+
Title: "Kamu sedang berkuliah dimana?",
37+
Description: fmt.Sprintf("Yuk pilih Universitas kamu dibawah ini, siapa tau jadi ada kenalan teman satu kampus 😊\nTotal ada %d dari %d halaman Universitas nih yang bisa kamu pilih dibawah ini. Kalau ngga ada bisa lapor ke kami ya 🤗", universities.TotalItems, universities.TotalPages),
38+
Color: viper.GetInt("discord.setting.embed.color.default"),
39+
}
40+
41+
// embedPagination := &discordgo.MessageEmbed{}
42+
43+
selectMenuOption := []discordgo.SelectMenuOption{}
44+
for _, university := range universities.Data {
45+
selectMenuOption = append(selectMenuOption, discordgo.SelectMenuOption{
46+
Label: university.NamaPT,
47+
Description: fmt.Sprintf("%s, %s", university.KabKotaPT, university.ProvinsiPT),
48+
Value: university.NamaPT,
49+
})
50+
}
51+
52+
_, err = s.ChannelMessageSendComplex(msg.ChannelID, &discordgo.MessageSend{
53+
Embeds: []*discordgo.MessageEmbed{
54+
embed,
55+
},
56+
Components: []discordgo.MessageComponent{
57+
discordgo.ActionsRow{
58+
Components: []discordgo.MessageComponent{
59+
discordgo.SelectMenu{
60+
CustomID: "universities",
61+
Options: selectMenuOption,
62+
},
63+
},
64+
},
65+
},
66+
})
67+
68+
if err != nil {
69+
log.Fatal(err)
70+
}
71+
}

internal/app/delivery/discord/event/ready.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,17 @@ func (h *DiscordEventHandler) Ready(s *discordgo.Session, _ *discordgo.Ready) {
1717
},
1818
})
1919
log.Println("Discord bot online as " + s.State.User.Username)
20+
21+
// s.GuildOnboardingEdit("", &discordgo.GuildOnboarding{
22+
// Prompts: &[]discordgo.GuildOnboardingPrompt{
23+
// {
24+
// ID: "university",
25+
// Type: discordgo.GuildOnboardingPromptTypeDropdown,
26+
// Required: false,
27+
// Options: []discordgo.GuildOnboardingPromptOption{
28+
// {}
29+
// },
30+
// },
31+
// },
32+
// })
2033
}

internal/app/model/pddikti_model.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package model
2+
3+
type PDDIKTIUniversity struct {
4+
IDSP string `json:"idsp,omitempty"`
5+
KabKotaPT string `json:"kab_kota_pt,omitempty"`
6+
ProvinsiPT string `json:"provinsi_pt,omitempty"`
7+
Akreditasi string `json:"akreditasi,omitempty"`
8+
NamaSingkat string `json:"nama_singkat,omitempty"`
9+
StatusPT string `json:"status_pt,omitempty"`
10+
NamaPT string `json:"nama_pt,omitempty"`
11+
JenisPT string `json:"jenis_pt,omitempty"`
12+
JumlahProdi int `json:"jumlah_prodi,omitempty"`
13+
RangeBiayaKuliah string `json:"range_biaya_kuliah,omitempty"`
14+
}
15+
16+
type PDDIKTIUniversityResponse struct {
17+
Data []PDDIKTIUniversity `json:"data,omitempty"`
18+
Page int `json:"page,omitempty"`
19+
Limit int `json:"limit,omitempty"`
20+
TotalItems int `json:"totalItems,omitempty"`
21+
TotalPages int `json:"totalPages,omitempty"`
22+
}

internal/app/service/example_service.go

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package service
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io"
7+
"net/http"
8+
"net/url"
9+
10+
"github.com/spf13/viper"
11+
"github.com/verdex-id/verdex-bot/internal/app/model"
12+
)
13+
14+
type PDDIKTIService struct {
15+
}
16+
17+
func NewPDDIKTIService() *PDDIKTIService {
18+
return &PDDIKTIService{}
19+
}
20+
21+
func (s *PDDIKTIService) GetManyUniversity(page int) (*model.PDDIKTIUniversityResponse, error) {
22+
uri, _ := url.Parse("https://pddikti.kemdikbud.go.id/api/v2/pt/search/filter")
23+
24+
params := uri.Query()
25+
26+
// Basic URL
27+
// https://pddikti.kemdikbud.go.id/api/v2/pt/search/filter?limit=15&page=1&akreditasi=&jenis=&provinsi=&status=&
28+
29+
params.Set("limit", "10")
30+
params.Set("page", fmt.Sprint(page))
31+
params.Set("status", "A") // A = Active
32+
33+
uri.RawQuery = params.Encode()
34+
35+
client := http.Client{}
36+
req, _ := http.NewRequest(http.MethodGet, uri.String(), nil)
37+
req.Header.Set("x-api-key", viper.GetString("pddikti.api_key"))
38+
39+
resp, err := client.Do(req)
40+
if err != nil {
41+
return nil, err
42+
}
43+
defer resp.Body.Close()
44+
45+
body, _ := io.ReadAll(resp.Body)
46+
47+
var pddiktiUniversityResponse *model.PDDIKTIUniversityResponse
48+
json.Unmarshal(body, &pddiktiUniversityResponse)
49+
50+
return pddiktiUniversityResponse, nil
51+
}

test/pddikti_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/verdex-id/verdex-bot/internal/app/service"
7+
"github.com/verdex-id/verdex-bot/internal/infrastructure/config"
8+
)
9+
10+
func init() {
11+
config.Load()
12+
}
13+
14+
func TestFetchData(t *testing.T) {
15+
s := service.NewPDDIKTIService()
16+
17+
s.GetManyUniversity(1)
18+
}

0 commit comments

Comments
 (0)