freescout-help-desk / freescout

FreeScout — Free self-hosted help desk & shared mailbox (Zendesk / Help Scout alternative)
https://freescout.net
GNU Affero General Public License v3.0
2.99k stars 491 forks source link

Any plans to add chat (website embed) #277

Closed BrianGilbert closed 3 years ago

BrianGilbert commented 5 years ago

We currently use helpscout and are looking at switching and wondering if you have plans to add this functionality?

freescout-helpdesk commented 5 years ago

Yes, but not very soon. If some developer will be willing to implement it earler the freescout team will be glad to assist.

szucher commented 4 years ago

Hi there, any new news for a live-chat modul?

freescout-helpdesk commented 4 years ago

Maybe in 2 years.

yamakrane commented 4 years ago

Hey, interested in developping one similar to HelpScout's. How can you provide me feedback ?

freescout-helpdesk commented 4 years ago

@yamakrane Please email at support@freescout.net

caseyjhol commented 4 years ago

@yamakrane Have you made any progress on this? I'd be interested in helping.

yamakrane commented 4 years ago

Hey @caseyjhol, nope couldn’t make any progress as I thought the core could take VueJs.

caseyjhol commented 4 years ago

This is a complex enough thing, I'm wondering if it would make more sense to just integrate with an open source live chat option (https://github.com/chatwoot/chatwoot and https://github.com/RocketChat/Rocket.Chat look solid).

freescout-helpdesk commented 3 years ago

Chat module may be implemented, but not in the nearest future.

freescout-helpdesk commented 3 years ago

https://freescout.net/module/chat/

foliovision commented 3 years ago

Awesome work, Freescout Team. Basic live chat is exactly what we need right now.

There is a feature which would really help us. User Story: Agents would like to be able to turn on Live Chat when they are available. Currently it's necessary to either use 1. office hours, which are not always accurate 2. removing and adding the freescout code in the website footer. The first one is not very flexible. The second is a security risk.

Solution: Agents can enable live chat within FreeScout by enabling and disabling LiveChat in the left hand column with a toggle button:

> Livechat ( On | Off )

If there are no agents live, ideally the live chat would turn itself off if there are no agents live. Turning itself on could be a manual operation as a live agent does not necessarily want to accept livechat requests (can ruin an evening when dropping in to answer an urgent ticket).

I don't know if agent status is currently tracked in Freescout.

What I'd like to see as a solution would be a very simple system. Each support user could toggle a button "Available for Live Chat" either at the top of every page or in the right hand column. If there is no support agent available, live chat would turn itself off and become the Contact form. If the live agent is no longer online, live chat would turn itself off automatically.

Exception: I'm not quite sure how to handle an agent who has clicked available for live chat but who is working in another application and just passively monitoring the conversation. Such an agent may not show up as live at all and be automatically turned off. I suppose there could be an alert every 15 minutes without action: "Would you like to continue to monitor livechat?" No answer would mean turning off that agent for live chat until s/he turns on again.

foliovision commented 3 years ago

We are having an issue with the live chat - if the user enters email address which is already in the Freescount help desk, it fails to save. This is the error log entry I found:

[2021-06-02 16:29:20] production.ERROR: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'm...@gmail.com' for key 'emails_email_unique' (SQL: insert into `emails` (`email`, `customer_id`) values (m...@gmail.com, 5556)) {"exception
":"[object] (Illuminate\\Database\\QueryException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'm...@gmail.com' for key 'emails_email_unique' (SQL: insert into `emails` (`email`, `customer_id`) values (martinpossible@gmail
.com, 5556)) at /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664, Doctrine\\DBAL\\Driver\\PDO\\Exception(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'm...@gmail.com' for key '
emails_email_unique' at /home/user/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDO/Exception.php:18, PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'm...@gmail.com' for key 'emails_email_unique
' at /home/user/public_html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:115)
[stacktrace]
#0 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(624): Illuminate\\Database\\Connection->runQueryCallback('insert into `em...', Array, Object(Closure))
#1 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(459): Illuminate\\Database\\Connection->run('insert into `em...', Array, Object(Closure))
#2 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(411): Illuminate\\Database\\Connection->statement('insert into `em...', Array)
#3 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Query/Processors/Processor.php(32): Illuminate\\Database\\Connection->insert('insert into `em...', Array)
#4 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2159): Illuminate\\Database\\Query\\Processors\\Processor->processInsertGetId(Object(Watson\\Rememberable\\Query\\Builder), 'insert into `em...', Array, 'id')
#5 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1285): Illuminate\\Database\\Query\\Builder->insertGetId(Array, 'id')
#6 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(722): Illuminate\\Database\\Eloquent\\Builder->__call('insertGetId', Array)
#7 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(687): Illuminate\\Database\\Eloquent\\Model->insertAndSetId(Object(Illuminate\\Database\\Eloquent\\Builder), Array)
#8 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(550): Illuminate\\Database\\Eloquent\\Model->performInsert(Object(Illuminate\\Database\\Eloquent\\Builder))
#9 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php(250): Illuminate\\Database\\Eloquent\\Model->save()
#10 /home/user/public_html/app/Customer.php(619): Illuminate\\Database\\Eloquent\\Relations\\HasOneOrMany->save(Object(App\\Email))
#11 /home/user/public_html/Modules/Chat/Http/Controllers/ChatFrontendController.php(251): App\\Customer->addEmail('martinpossible@...')
#12 [internal function]: Modules\\Chat\\Http\\Controllers\\ChatFrontendController->ajax(Object(Illuminate\\Http\\Request))
#13 /home/user/public_html/overrides/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#14 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('ajax', Array)
#15 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(Modules\\Chat\\Http\\Controllers\\ChatFrontendController), 'ajax')
#16 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\\Routing\\Route->runController()
#17 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\\Routing\\Route->run()
#18 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#19 /home/user/public_html/app/Http/Middleware/Localize.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#20 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\\Http\\Middleware\\Localize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#21 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#22 /home/user/public_html/app/Http/Middleware/HttpsRedirect.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#23 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\\Http\\Middleware\\HttpsRedirect->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#24 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#25 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#26 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#27 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#28 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#29 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#30 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#31 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(59): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#32 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#33 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#34 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#35 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(660): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#36 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(635): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#37 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(601): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#38 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(590): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#39 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#40 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#41 /home/user/public_html/app/Http/Middleware/TerminateHandler.php(12): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#42 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\\Http\\Middleware\\TerminateHandler->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#43 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#44 /home/user/public_html/app/Http/Middleware/ResponseHeaders.php(11): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#45 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\\Http\\Middleware\\ResponseHeaders->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#46 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#47 /home/user/public_html/vendor/fideloper/proxy/src/TrustProxies.php(56): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#48 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#49 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#50 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#51 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#52 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#53 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#54 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#55 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#56 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#57 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#58 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#59 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#60 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#61 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#62 /home/user/public_html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
foliovision commented 3 years ago

Suggestion to other users who may find this discussion about live chat: a great way to toggle between live chat and simple contact form on a WordPress site is to toggle the code in the footer with a special WordPress function. We are coding such a function and will put it in the address bar. We'll probably add it to our BusinessPress plugin which has includes a number of other fixes for common WordPress issues..