Skip to content

Commit c286af0

Browse files
authored
Merge pull request #8 from interactions-py/unstable
chore: merge unstable to main
2 parents eb0c29b + 792b85f commit c286af0

File tree

10 files changed

+279
-560
lines changed

10 files changed

+279
-560
lines changed

README.md

Lines changed: 59 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,126 +2,123 @@
22

33
## Installation
44

5-
1. Download Java if you don't have it
5+
Download ext via `pip install --upgrade interactions-lavalink`
6+
7+
## Configuring own lavalink server
8+
9+
1. Download Java SE if you don't have it
610
2. Download lavalink from [this repo](https://github.com/freyacodes/Lavalink)
711
3. Configure `application.yml` file like [here](https://github.com/freyacodes/Lavalink/blob/master/LavalinkServer/application.yml.example)
8-
4. Download ext via `pip install interactions-lavalink`
12+
4. Run lavalink server via `java -jar Lavalink.jar` in same folder with `application.yml` file.
913

1014
## Usage
1115

12-
Run lavalink via `java -jar Lavalink.jar` in same folder with `application.yml` file.
1316
Create bot like example and run it.
1417

1518
Main file:
1619
```python
17-
import interactions
18-
from interactions.ext.lavalink import VoiceState, VoiceClient
20+
from interactions import Client
21+
1922

20-
client = VoiceClient(...)
23+
# Creating bot variable
24+
client = Client(...)
2125

26+
# Loading your extension
2227
client.load("exts.music")
2328

29+
# Starting bot
2430
client.start()
2531
```
2632

2733
Extension file: `exts/music.py`
2834
```python
29-
import interactions
30-
from interactions.ext.lavalink import VoiceClient, VoiceState, listener, Player
31-
import lavalink
35+
from interactions import Extension, extension_command, extension_listener, option, CommandContext, VoiceState
36+
from interactions.ext.lavalink import Lavalink
3237

3338

34-
class Music(interactions.Extension):
39+
class Music(Extension):
3540
def __init__(self, client):
36-
self.client: VoiceClient = client
41+
self.client = client
42+
self.lavalink: Lavalink = None
3743

38-
@listener()
39-
async def on_track_start(self, event: lavalink.TrackStartEvent):
40-
"""
41-
Fires when track starts
42-
"""
43-
print("STARTED", event.track)
44-
45-
@interactions.extension_listener()
44+
@extension_listener()
4645
async def on_start(self):
47-
self.client.lavalink_client.add_node("127.0.0.1", 43421, "your_password", "eu")
48-
49-
@interactions.extension_listener()
50-
async def on_voice_state_update(self, before: VoiceState, after: VoiceState):
51-
"""
52-
Disconnect if bot is alone
53-
"""
54-
if before and not after.joined:
55-
voice_states = self.client.get_channel_voice_states(before.channel_id)
56-
if len(voice_states) == 1 and voice_states[0].user_id == self.client.me.id:
57-
await self.client.disconnect(before.guild_id)
58-
59-
@interactions.extension_command()
60-
@interactions.option()
61-
async def play(self, ctx: interactions.CommandContext, query: str):
46+
# Initialize lavalink instance
47+
self.lavalink: Lavalink = Lavalink(self.client)
48+
49+
# Connect to lavalink server
50+
self.lavalink.add_node("127.0.0.1", 43421, "your_password", "eu")
51+
52+
@extension_command()
53+
@option()
54+
async def play(self, ctx: CommandContext, query: str):
6255
await ctx.defer()
6356

64-
# NOTE: ctx.author.voice can be None if you ran a bot after joining the voice channel
65-
voice: VoiceState = ctx.author.voice
66-
if not voice or not voice.joined:
57+
# Getting user's voice state
58+
voice_state: VoiceState = ctx.author.voice_state
59+
if not voice_state or not voice_state.joined:
6760
return await ctx.send("You're not connected to the voice channel!")
6861

69-
player: Player # Typehint player variable to see their methods
70-
if (player := ctx.guild.player) is None:
71-
player = await voice.connect()
62+
# Connecting to voice channel and getting player instance
63+
player = await self.lavalink.connect(voice_state.guild_id, voice_state.channel_id)
7264

65+
# Getting tracks from youtube
7366
tracks = await player.search_youtube(query)
67+
# Selecting first founded track
7468
track = tracks[0]
69+
# Adding track to the queue
7570
player.add(requester=int(ctx.author.id), track=track)
7671

72+
# Check if already playing
7773
if player.is_playing:
7874
return await ctx.send(f"Added to queue: `{track.title}`")
75+
76+
# Starting playing track
7977
await player.play()
8078
await ctx.send(f"Now playing: `{track.title}`")
8179

82-
@interactions.extension_command()
83-
async def leave(self, ctx: interactions.CommandContext):
84-
await self.client.disconnect(ctx.guild_id)
80+
@extension_command()
81+
async def leave(self, ctx: CommandContext):
82+
# Disconnect from voice channel and remove player
83+
await self.lavalink.disconnect(ctx.guild_id)
84+
85+
await ctx.send("Disconnected", ephemeral=True)
86+
87+
88+
def setup(client):
89+
Music(client)
90+
8591
```
8692

8793
## Events
88-
To listen lavalink event you have to use `@listener` decorator.
94+
To listen lavalink event you have to use either `@bot.event` or `@extension_listener` decorator.
8995

9096
```python
91-
import lavalink
92-
from interactions.ext.lavalink import listener
97+
from interactions import Extension, extension_listener
9398

99+
import lavalink
94100

95-
# NOTE: Works only in extensions.
96101
class MusicExt(Extension):
97-
...
102+
... # Some your cool music commands
98103

99-
# There are most useful events for you. You can use other events if you want it.
100-
@listener()
104+
# There are many useful events for you. You can use other events if you want it.
105+
@extension_listener()
101106
async def on_track_start(self, event: lavalink.TrackStartEvent):
102107
"""Fires when track starts"""
103108

104-
@listener()
109+
@extension_listener()
105110
async def on_track_end(self, event: lavalink.TrackEndEvent):
106111
"""Fires when track ends"""
107112

108-
@listener()
113+
@extension_listener()
109114
async def on_queue_end(self, event: lavalink.QueueEndEvent):
110115
"""Fires when queue ends"""
111116

112117
```
113118

114-
## New methods/properties for interactions.py library
115-
116-
`Member.voice` - returns current member's `VoiceState`. It can be `None` if not cached.
117-
`Channel.voice_states` - returns a list of voice states of the voice channel. Can be empty if not cached.
118-
`Guild.voice_states` - returns a list of guild voice states. Can be empty if not cached.
119+
More events you could find in the `lavalink.py` documentation
119120

120121
## Documentation
121122

122-
[lavalink.py documentation](https://lavalink.readthedocs.io/en/master/)
123+
[lavalink.py documentation](https://lavalink.readthedocs.io/en/master/) \
123124
[lavalink.py repository](https://github.com/Devoxin/Lavalink.py)
124-
125-
## Credits
126-
127-
Thanks EdVraz for `VoiceState` from [voice ext](https://github.com/interactions-py/voice)

examples/exts/music.py

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,61 @@
1-
import interactions
2-
from interactions.ext.lavalink import Player, VoiceClient, VoiceState
3-
4-
5-
class Music(interactions.Extension):
1+
from interactions import (
2+
CommandContext,
3+
Extension,
4+
VoiceState,
5+
extension_command,
6+
extension_listener,
7+
option,
8+
)
9+
from interactions.ext.lavalink import Lavalink
10+
11+
12+
class Music(Extension):
613
def __init__(self, client):
7-
self.client: VoiceClient = client
14+
self.client = client
15+
self.lavalink: Lavalink = None
816

9-
@interactions.extension_listener()
17+
@extension_listener()
1018
async def on_start(self):
11-
self.client.lavalink_client.add_node("127.0.0.1", 43421, "your_password", "eu")
12-
13-
@interactions.extension_listener()
14-
async def on_voice_state_update(self, before: VoiceState, after: VoiceState):
15-
"""
16-
Disconnect if bot is alone
17-
"""
18-
if before and not after.joined:
19-
voice_states = self.client.get_channel_voice_states(before.channel_id)
20-
if len(voice_states) == 1 and voice_states[0].user_id == self.client.me.id:
21-
await self.client.disconnect(before.guild_id)
22-
23-
@interactions.extension_command()
24-
@interactions.option()
25-
async def play(self, ctx: interactions.CommandContext, query: str):
19+
# Initialize lavalink instance
20+
self.lavalink: Lavalink = Lavalink(self.client)
21+
22+
# Connect to lavalink server
23+
self.lavalink.add_node("127.0.0.1", 43421, "your_password", "eu")
24+
25+
@extension_command()
26+
@option()
27+
async def play(self, ctx: CommandContext, query: str):
2628
await ctx.defer()
2729

28-
# NOTE: ctx.author.voice can be None if you ran a bot after joining the voice channel
29-
voice: VoiceState = ctx.author.voice
30-
if not voice or not voice.joined:
30+
# Getting user's voice state
31+
voice_state: VoiceState = ctx.author.voice_state
32+
if not voice_state or not voice_state.joined:
3133
return await ctx.send("You're not connected to the voice channel!")
3234

33-
player: Player # Typehint player variable to see their methods
34-
if (player := ctx.guild.player) is None:
35-
player = await voice.connect()
35+
# Connecting to voice channel and getting player instance
36+
player = await self.lavalink.connect(voice_state.guild_id, voice_state.channel_id)
3637

38+
# Getting tracks from youtube
3739
tracks = await player.search_youtube(query)
40+
# Selecting first founded track
3841
track = tracks[0]
42+
# Adding track to the queue
3943
player.add(requester=int(ctx.author.id), track=track)
4044

45+
# Check if already playing
4146
if player.is_playing:
4247
return await ctx.send(f"Added to queue: `{track.title}`")
48+
49+
# Starting playing track
4350
await player.play()
4451
await ctx.send(f"Now playing: `{track.title}`")
4552

46-
@interactions.extension_command()
47-
async def leave(self, ctx: interactions.CommandContext):
48-
await self.client.disconnect(ctx.guild_id)
53+
@extension_command()
54+
async def leave(self, ctx: CommandContext):
55+
# Disconnect from voice channel and remove player
56+
await self.lavalink.disconnect(ctx.guild_id)
4957

50-
@interactions.extension_command()
51-
@interactions.option(channel_types=[interactions.ChannelType.GUILD_VOICE])
52-
async def move_to(self, ctx: interactions.CommandContext, channel: interactions.Channel):
53-
await self.client.connect(ctx.guild_id, channel.id)
58+
await ctx.send("Disconnected", ephemeral=True)
5459

5560

5661
def setup(client):

interactions/ext/lavalink/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
from .base import * # noqa
2-
from .client import * # noqa
3-
from .helpers import * # noqa
4-
from .models import * # noqa
5-
from .websocket import * # noqa
2+
from .extension import * # noqa
3+
from .player import * # noqa

interactions/ext/lavalink/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from interactions.ext.base import Base
22
from interactions.ext.version import Version, VersionAuthor
33

4-
__all__ = ["version", "base"]
5-
__version__ = "0.1.2"
4+
__all__ = ("version", "base")
5+
__version__ = "1.0.0"
66

77
version = Version(
88
version=__version__, author=VersionAuthor(name="Damego", email="damego.dev@gmail.com")

0 commit comments

Comments
 (0)