Skip to content

Commit 197b007

Browse files
gumuzferhatelmas
andauthored
[CHAT-2590] added pin_message, unpin_message & update_message_partial (#84)
* added pin_message, unpin_message & update_message_partial * linting fix * Update stream_chat/async_chat/client.py Co-authored-by: ferhat elmas <[email protected]>
1 parent 8cf8fb9 commit 197b007

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed

stream_chat/async_chat/client.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,35 @@ async def unmute_user(self, target_id, user_id):
187187
async def mark_all_read(self, user_id):
188188
return await self.post("channels/read", data={"user": {"id": user_id}})
189189

190+
async def pin_message(self, message_id, user_id, expiration=None):
191+
updates = {
192+
"set": {
193+
"pinned": True,
194+
"pin_expires": expiration,
195+
}
196+
}
197+
return await self.update_message_partial(message_id, updates, user_id)
198+
199+
async def unpin_message(self, message_id, user_id):
200+
updates = {
201+
"set": {
202+
"pinned": False,
203+
}
204+
}
205+
return await self.update_message_partial(message_id, updates, user_id)
206+
190207
async def update_message(self, message):
191208
if message.get("id") is None:
192209
raise ValueError("message must have an id")
193210
return await self.post(f"messages/{message['id']}", data={"message": message})
194211

212+
async def update_message_partial(self, message_id, updates, user_id, **options):
213+
data = updates.copy()
214+
if user_id:
215+
data["user"] = {"id": user_id}
216+
data.update(options)
217+
return await self.put(f"messages/{message_id}", data=data)
218+
195219
async def delete_message(self, message_id, **options):
196220
return await self.delete(f"messages/{message_id}", options)
197221

stream_chat/base/client.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,22 @@ def unmute_user(self, target_id, user_id):
184184
def mark_all_read(self, user_id):
185185
pass
186186

187+
@abc.abstractmethod
188+
def pin_message(self, message_id, user_id, expiration=None):
189+
pass
190+
191+
@abc.abstractmethod
192+
def unpin_message(self, message_id, user_id):
193+
pass
194+
187195
@abc.abstractmethod
188196
def update_message(self, message):
189197
pass
190198

199+
@abc.abstractmethod
200+
def update_message_partial(self, message_id, updates, user_id, **options):
201+
pass
202+
191203
@abc.abstractmethod
192204
def delete_message(self, message_id, **options):
193205
pass

stream_chat/client.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,35 @@ def unmute_user(self, target_id, user_id):
183183
def mark_all_read(self, user_id):
184184
return self.post("channels/read", data={"user": {"id": user_id}})
185185

186+
def pin_message(self, message_id, user_id, expiration=None):
187+
updates = {
188+
"set": {
189+
"pinned": True,
190+
"pin_expires": expiration,
191+
}
192+
}
193+
return self.update_message_partial(message_id, updates, user_id)
194+
195+
def unpin_message(self, message_id, user_id):
196+
updates = {
197+
"set": {
198+
"pinned": False,
199+
}
200+
}
201+
return self.update_message_partial(message_id, updates, user_id)
202+
186203
def update_message(self, message):
187204
if message.get("id") is None:
188205
raise ValueError("message must have an id")
189206
return self.post(f"messages/{message['id']}", data={"message": message})
190207

208+
def update_message_partial(self, message_id, updates, user_id, **options):
209+
data = updates.copy()
210+
if user_id:
211+
data["user"] = {"id": user_id}
212+
data.update(options)
213+
return self.put(f"messages/{message_id}", data=data)
214+
191215
def delete_message(self, message_id, **options):
192216
return self.delete(f"messages/{message_id}", options)
193217

stream_chat/tests/async_chat/test_client.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,21 @@ async def test_unflag_user(self, event_loop, client, random_user, server_user):
245245
async def test_mark_all_read(self, event_loop, client, random_user):
246246
await client.mark_all_read(random_user["id"])
247247

248+
@pytest.mark.asyncio
249+
async def test_pin_unpin_message(self, event_loop, client, channel, random_user):
250+
msg_id = str(uuid.uuid4())
251+
response = await channel.send_message(
252+
{"id": msg_id, "text": "hello world"}, random_user["id"]
253+
)
254+
assert response["message"]["text"] == "hello world"
255+
response = await client.pin_message(msg_id, random_user["id"])
256+
assert response["message"]["pinned_at"] is not None
257+
assert response["message"]["pinned_by"]["id"] == random_user["id"]
258+
259+
response = await client.unpin_message(msg_id, random_user["id"])
260+
assert response["message"]["pinned_at"] is None
261+
assert response["message"]["pinned_by"] is None
262+
248263
@pytest.mark.asyncio
249264
async def test_update_message(self, event_loop, client, channel, random_user):
250265
msg_id = str(uuid.uuid4())
@@ -261,6 +276,23 @@ async def test_update_message(self, event_loop, client, channel, random_user):
261276
}
262277
)
263278

279+
@pytest.mark.asyncio
280+
async def test_update_message_partial(
281+
self, event_loop, client, channel, random_user
282+
):
283+
msg_id = str(uuid.uuid4())
284+
response = await channel.send_message(
285+
{"id": msg_id, "text": "hello world"}, random_user["id"]
286+
)
287+
assert response["message"]["text"] == "hello world"
288+
response = await client.update_message_partial(
289+
msg_id,
290+
dict(set=dict(awesome=True, text="helloworld")),
291+
random_user["id"],
292+
)
293+
assert response["message"]["text"] == "helloworld"
294+
assert response["message"]["awesome"] is True
295+
264296
@pytest.mark.asyncio
265297
async def test_delete_message(self, event_loop, client, channel, random_user):
266298
msg_id = str(uuid.uuid4())

stream_chat/tests/test_client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,20 @@ def test_unflag_user(self, client, random_user, server_user):
212212
def test_mark_all_read(self, client, random_user):
213213
client.mark_all_read(random_user["id"])
214214

215+
def test_pin_unpin_message(self, client, channel, random_user):
216+
msg_id = str(uuid.uuid4())
217+
response = channel.send_message(
218+
{"id": msg_id, "text": "hello world"}, random_user["id"]
219+
)
220+
assert response["message"]["text"] == "hello world"
221+
response = client.pin_message(msg_id, random_user["id"])
222+
assert response["message"]["pinned_at"] is not None
223+
assert response["message"]["pinned_by"]["id"] == random_user["id"]
224+
225+
response = client.unpin_message(msg_id, random_user["id"])
226+
assert response["message"]["pinned_at"] is None
227+
assert response["message"]["pinned_by"] is None
228+
215229
def test_update_message(self, client, channel, random_user):
216230
msg_id = str(uuid.uuid4())
217231
response = channel.send_message(
@@ -227,6 +241,20 @@ def test_update_message(self, client, channel, random_user):
227241
}
228242
)
229243

244+
def test_update_message_partial(self, client, channel, random_user):
245+
msg_id = str(uuid.uuid4())
246+
response = channel.send_message(
247+
{"id": msg_id, "text": "hello world"}, random_user["id"]
248+
)
249+
assert response["message"]["text"] == "hello world"
250+
response = client.update_message_partial(
251+
msg_id,
252+
dict(set=dict(awesome=True, text="helloworld")),
253+
random_user["id"],
254+
)
255+
assert response["message"]["text"] == "helloworld"
256+
assert response["message"]["awesome"] is True
257+
230258
def test_delete_message(self, client, channel, random_user):
231259
msg_id = str(uuid.uuid4())
232260
channel.send_message({"id": msg_id, "text": "helloworld"}, random_user["id"])

0 commit comments

Comments
 (0)