coliving/talk

这是从 Nahid/Talk 分支出来的,为了使其与新的 Laravel 8.x、9.x、10.x 和 11.x 兼容。Talk 是一个基于 Laravel 8、9、10 和 11 的实时消息、聊天和对话系统。它帮助以简单的方式开发用户的消息、聊天和对话。

1.6.1 2024-05-10 08:23 UTC

README

这是从 Nahid/Talk 分支出来的,为了使其与新的 Laravel 8、9、10、11 兼容。Talk 是一个基于 Laravel 8、9、10、11 的实时消息、聊天和对话系统。它帮助以简单的方式开发用户的消息、聊天和对话。

Laravel-Talk

Awesome Laravel GitHub license Build Status

Talk 是一个基于 Laravel 8、9、10、11 的用户对话(收件箱)系统,具有实时消息功能。您可以轻松地将此软件包集成到任何基于 Laravel 的项目中。它可以帮助您在几分钟内开发消息系统。以下是 Talk 开发的一个项目截图。

Talk v2.1.0 支持实时消息。了解更多关于 Talk 实时消息

反馈

如果您已经使用过 Talk,请与我们分享您的体验。这将使项目变得更好。

给我们反馈

使用 Talk 构建

如果您在项目中使用 Talk,请与我们分享您的项目 URL 或项目名称。这将激励其他人使用 Talk。

查看使用 Talk 构建的项目 Built with Talk

注意

不要直接从高于 1.1.7 的版本迁移。请先尝试我们的 示例项目,然后再将其应用于您的项目。

Talk-Example Screenshot

您可以尝试 Talk-Example 项目。

或者您可以通过使用此凭据 演示

username: admin
password: admin

所以,让我们开始您的探索之旅吧 :)

功能

  • 一对一消息
  • 实时消息
  • 创建新对话
  • 显示最新消息的消息线程
  • 通过用户 ID 或对话 ID 查看对话
  • 支持在线程和消息中分页
  • 从两端删除(软删除)消息。发送者和接收者都可以从他们的一端删除他们的消息。
  • 永久删除消息
  • 标记消息为已读
  • 只有参与者可以查看或访问他们的消息或消息线程

安装

Talk 是一个 Laravel 软件包,因此您可以通过 composer 安装它。从您的项目目录在终端中运行此命令。

composer require nahid/talk

请稍等片刻,Composer 会自动将 Talk 安装到您的项目中。

配置

下载完成后,您必须在 config/app.php 配置文件中调用此软件包服务。为此,请将此行添加到 app.php 文件的 providers 部分中

Nahid\Talk\TalkServiceProvider::class,

要使用外观,您必须将此行添加到 app.php 文件的 aliases 数组中

'Talk'      => Nahid\Talk\Facades\Talk::class,

现在,在终端中运行此命令以发布此软件包的资源

php artisan vendor:publish --provider="Nahid\Talk\TalkServiceProvider"

运行此命令后,所有必要的文件都将包含在您的项目中。此软件包有两个默认迁移。因此,您必须运行类似的迁移命令。(但请确保您的数据库配置正确。)

php artisan migrate

好的,现在您需要为 Talk 配置您的用户模型。转到 config/talk.php 并进行配置。

return [
    'user' => [
        'model' => 'App\User'
    ],
    'broadcast' => [
        'enable' => false,
        'app_name' => 'your-app-name',
        'pusher' => [
            'app_id'        => '',
            'app_key'       => '',
            'app_secret'    => '',
            'options' => [
                 'cluster' => 'ap1',
                 'encrypted' => true
            ]
        ]
    ]
];

用法

使用非常简单。如果您想全局设置认证用户ID,则必须首先设置中间件。转到 app/Http/Kernel.php 并在 $routeMiddleware 数组中设置它。

'talk'  =>  \Nahid\Talk\Middleware\TalkMiddleware::class,

现在您可以从任何地方使用中间件了。假设您有一个控制器,并想全局设置认证用户ID,然后在控制器构造函数中编写以下内容:

$this->middleware('talk');

但是,您也可以在控制器的任何方法中使用这些过程来设置ID,而不是全局设置。

Talk::setAuthUserId(auth()->user()->id);

现在您可以使用您需要的任何方法。但是,如果您想立即传递认证ID,此方法可能有助于您。

Talk::user(auth()->user()->id)->anyMethodHere();

请参阅API文档。

API列表

setAuthUserId

setAuthUserId 方法设置当前登录用户ID,您通过参数传递。如果您传递 nullempty 值,则返回 false

语法

void setAuthUserId($userid)

示例

控制器构造函数是编写此方法的最佳位置。

function __construct()
{
    Talk::setAuthUserId(auth()->user()->id);
}

当您传递登录用户ID时,Talk 将知道当前为该系统认证的用户是谁。因此,Talk 将基于此用户检索所有信息。

user

您可以使用此方法而不是 setAuthUserId() 方法。当您需要立即访问用户的对话时,您可以使用它。语法

object user($id)

示例 当您没有全局设置认证用户ID时,您只需直接使用此方法与其他方法一起使用即可。

$inboxes = Talk::user(auth()->user()->id)->threads();
return view('messages.threads', compact('inboxes'));

isConversationExists

此方法检查当前登录用户,并检查给定用户是否已在会话中。

语法

int|false isConversationExists($userid)

示例

if ($conversationId = Talk::isConversationExists($userId)) {
    Talk::sendMessage($conversationId, $message);
}

isAuthenticUser

isAuthenticUser 检查给定的用户是否存在于给定的会话中。

语法

boolean isAuthenticUser($conversationId, $userId)

示例

if (Talk::isAuthenticUser($conversationId, $userId)) {
    Talk::sendMessage($conversationId, $message);
}

sendMessage

您可以通过使用此方法通过会话ID发送消息。如果消息成功发送,它将返回消息模型的对象,否则,它将返回 false

语法

object|false sendMessage($conversationId, $message)

示例

    $message = Talk::sendMessage($conversationId, $message);
    if ($message) {
        return response()->json(['status'=>'success', 'data'=>$message], 200);
   }

sendMessageByUserId

您可以通过使用此方法通过接收者ID发送消息。如果消息成功发送,它将返回消息模型的对象,否则,它将返回 false

语法

object|false sendMessageByUserId($userId, $message)

getInbox

如果您想获取所有收件箱(不包括软删除消息),此方法可能有助于您。此方法通过之前分配的认证用户ID获取所有收件箱。它返回带有最新消息的消息线程集合。

语法

array getInbox([$order = 'desc'[,$offset = 0[, $take = 20]]])

示例

// controller method
$inboxes = Talk::getInbox();
return view('message.threads', compact('inboxes');
<!-- messages/threads.blade.php -->
<ul>
    @foreach($inboxes as $inbox)
        <li>
            <h2>{{$inbox->withUser->name}}</h2>
            <p>{{$inbox->thread->message}}</p>
            <span>{{$inbox->thread->humans_time}}</span>
        </li>
    @endforeach
</ul>

getInboxAll

它与 getInbox() 方法类似。如果您想获取带有软删除消息的所有收件箱,此方法可能有助于您。此方法通过给定的用户ID获取所有收件箱。

语法

object getInboxAll([$order = 'desc'[,$offset = 0[, $take = 20]]])

threads

这是 getInbox() 方法的别名。

语法

array threads([$order = 'desc'[,$offset = 0[, $take = 20]]])

threadsAll

这是 getInboxAll() 方法的别名。

语法

array threadsAll([$order = 'desc'[,$offset = 0[, $take = 20]]])

getConversationsById

当您想要使用您想要的会话ID获取所有会话时,您可以尝试此方法。此方法返回所有会话(不包括软删除)以及 senderwithUser 对象。

语法

array getConversationsById($conversationId[, $offset = 0[, $take = 20]])

示例

// controller method
$conversations = Talk::getConversationsById($conversationId);
$messages = $conversations->messages;
$withUser = $conversations->withUser;

return view('messages.conversations', compact('messages', 'withUser'));

此方法返回两个对象 messageswithUsermessages 对象包含消息集合,而 withUser 对象包含参与者用户集合。

让我们看看如何与您的视图一起使用它。

<!-- messages/conversations.blade.php -->
<div class="message-container">
    <h2>Chat with {{$withUser->name}}</h2>
    @foreach($messages as $msg)
     <div class="message">
        <h4>{{$msg->sender->name}}</h4>
        <span>{{$msg->humans_time}}</span>
        <p>
            {{$msg->message}}
       </p>
    </div>
    @endforeach
</div>

getConversationsAllById

此方法类似于 getConversationsById()。这两种方法之间的唯一区别是它返回带有软删除条目的所有消息。

语法

array getConversationsAllById($conversationId[, $offset = 0[, $take = 20]])

getConversationsByUserId

当您想要使用您想要的接收者ID获取所有会话时,您可以尝试此方法。此方法返回所有会话(不包括软删除消息)以及用户对象。

语法

object getConversationsByUserId($receiverId [, $offset = 0[, $take = 20]])

getConversationsAllByUserId

此方法类似于 getConversationsByUserId()。这两种方法之间的唯一区别是它返回带有软删除条目的所有消息。

语法

array getConversationsAllByUserId($receiverId[, $offset = 0[, $take = 20]])

getMessages

这是getConversationsById()方法的别名。

语法

array messages($conversationId[, $offset = 0[, $take = 20]])

getMessagesAll

这是getConversationsAllById()方法的别名。

语法

array messagesAll($conversationId[, $offset = 0[, $take = 20]])

getMessagesByUserId

这是getConversationsByUserId()方法的别名。

语法

array messagesByUserId($receiverId[, $offset = 0[, $take = 20]])

getMessagesAllByUserId

这是getConversationsAllByUserId()方法的别名。

语法

array messagesAllByUserId($receiverId[, $offset = 0[, $take = 20]])

readMessage

如果您想读取一条单独的消息,可以使用它。此消息通过消息ID返回一个单独的消息对象。

语法

array readMessage($messageId)

getReceiverInfo

此方法返回关于消息接收者的所有信息。

此方法从版本2.0.0开始已弃用,并在版本2.0.2中被删除。

语法

object getReceiverInfo($conversationId)

makeSeen

如果您想将消息标记为已读,可以使用此方法。

语法

boolean makeSeen($messageId)

deleteMessage

当您想从会话中删除特定消息时,必须使用此方法。此方法对用户端单独进行软删除。

语法

boolean deleteMessage($messageId)

deleteForever

如果您想硬删除或永久删除特定消息,则必须使用此方法。

语法

boolean deleteForever($messageId)

deleteConversations

此方法用于永久删除所有会话。

语法

boolean deleteConversations($conversationId)

实时消息

Talk也支持实时消息,称为Talk-Live。Talk使用Pusher进行实时消息。因此,您首先需要配置Pusher。再次转到app/talk.php进行配置。

return [
    'user' => [
        'model' => 'App\User'
    ],
    'broadcast' => [
        'enable' => false,
        'app_name' => 'your-app-name',
        'pusher' => [
            'app_id'        => '',
            'app_key'       => '',
            'app_secret'    => ''
        ]
    ]
];

在这个新版本中,添加了带有Talk配置的广播部分。默认情况下,广播是禁用的。如果您想启用实时(实时)消息,则必须首先启用它。然后添加Pusher凭证。就是这样。每次发送消息时,Talk都会自动触发两个事件,一个用于特定用户,另一个用于特定会话。因此,您可以按需订阅一个或两个。最后,您必须使用talk_live()辅助函数订阅这些事件。转到您想订阅以处理消息数据的地方,按照以下代码执行。

<script>
    var msgshow = function(data) {
        // write what you want with this data

        console.log(data);
    }
</script>

{!! talk_live(['user'=>["id"=>auth()->user()->id, 'callback'=>['msgshow']]]) !!}

talk_live()支持一个数组参数。第一个参数是要订阅的频道名称。您不知道哪个频道进行了广播。Talk默认广播两个频道。一个用于用户,另一个用于会话。如果您想订阅当前登录用户的频道,您必须通过'user'键传递登录用户ID。

['user'=>['id'=>auth()->user()->id, 'callback'=>[]]或者您想订阅会话ID,您必须通过'conversation'键传递会话ID。

您可以为处理Pusher接收到的数据传递一个回调函数。对于userconversation部分都支持回调数组。因此,您可以像上一个示例中那样传递多个回调作为数组值。

您可以观看Talk-Live-Demo

尝试Demo项目

Talk-示例

特别感谢

Shipu Ahamed

谢谢 :)

本项目支持

嘿,兄弟!帮帮我喝点🍻!

Beerpay Beerpay