Background.purs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. module ExampleWebExt.Background where
  2. import Prelude
  3. import Browser.WebExt.BrowserAction (onClickedAddListener)
  4. import Browser.WebExt.Listener (mkListener)
  5. import Browser.WebExt.Port (Port)
  6. import Browser.WebExt.Runtime (MessageSender(..))
  7. import Browser.WebExt.Tabs (Tab)
  8. import Data.Argonaut.Decode (printJsonDecodeError)
  9. import Data.Either (Either(..))
  10. import Data.Foldable (for_)
  11. import Data.Int64 as I64
  12. import Data.Maybe (Maybe(..))
  13. import Effect (Effect)
  14. import Effect.Aff (launchAff_)
  15. import Effect.Class (liftEffect)
  16. import Effect.Class.Console (debug, error, log, logShow)
  17. import ExampleWebExt.NativeMessage (ApplicationProcess(..), NativeMessage(..), connectToNativeApplication, onNativeDisconnectAddListener, onNativeMessageAddListener, sendMessageToNative)
  18. import ExampleWebExt.RuntimeMessage (RuntimeMessage(..), onRuntimeMessageAddListener, sendMessageToContent)
  19. import ExampleWebExt.Storage (clearAllJobs, getJobsPath, storeJob)
  20. import LinkedIn.Jobs.JobOffer (JobOffer(..))
  21. import LinkedIn.Output.Types (Output(..))
  22. import LinkedIn.PageUrl (PageUrl(..))
  23. import LinkedIn.UI.Basic.Types (JobOfferId(..))
  24. import Web.URL as URL
  25. main :: Effect Unit
  26. main = do
  27. log "[bg] starting up"
  28. port <- connectToNativeApplication "job_search_background"
  29. onNativeMessageAddListener port nativeMessageHandler
  30. onNativeDisconnectAddListener port \p -> log $ "disconnected from native port " <> p.name <> " (" <> p.error <> ")"
  31. sendConfigurationToNative port
  32. onClickedAddListener $ mkListener browserActionOnClickedHandler
  33. onRuntimeMessageAddListener $ contentScriptMessageHandler port
  34. browserActionOnClickedHandler :: Tab -> Effect Unit
  35. browserActionOnClickedHandler tab = do
  36. logShow tab
  37. _ <- sendMessageToContent tab.id RuntimeMessageRequestPageContent
  38. pure unit
  39. contentScriptMessageHandler ∷ Port -> RuntimeMessage -> MessageSender → Effect Unit
  40. contentScriptMessageHandler
  41. port
  42. (RuntimeMessagePageContent (UrlJobOffer (JobOfferId jobId)) (OutJobOffer offer))
  43. (MessageSender {tab: Just {url, title}}) =
  44. case maybeMsg offer of
  45. Just msg -> sendMessageToNative port msg
  46. Nothing -> error "Job offer sent by content script could not be sent"
  47. where
  48. maybeMsg (JobOffer jo) = ado
  49. url <- cleanUpUrl url
  50. in NativeMessageAddJob {
  51. id: "linked_in_" <> I64.toString jobId,
  52. origin: "linked_in",
  53. title: jo.title,
  54. url,
  55. alternate_url: Nothing,
  56. company: jo.companyName,
  57. location: jo.location,
  58. comment: Nothing,
  59. company_domain: jo.companyDomain,
  60. company_url: Just jo.companyLink,
  61. flexibility: jo.flexibility,
  62. application_process: Just $ if jo.hasSimplifiedApplicationProcess then ApplicationProcessLinkedInSimplified else ApplicationProcessRegular,
  63. application_date: Nothing,
  64. application_rejection_date: Nothing,
  65. application_considered: Nothing
  66. }
  67. contentScriptMessageHandler _ m (MessageSender {tab, id}) = do
  68. let
  69. senderMsg = case tab of
  70. Just {url} -> "tab " <> url
  71. Nothing -> "unknown " <> id
  72. msg = "[bg] received " <> show m <> " from " <> senderMsg
  73. debug msg
  74. cleanUpUrl :: String -> Maybe String
  75. cleanUpUrl u = do
  76. url <- URL.fromAbsolute u
  77. pure $ URL.toString $ URL.setSearch "" url
  78. nativeMessageHandler ∷ Port -> NativeMessage → Effect Unit
  79. nativeMessageHandler _ (NativeMessageJobOfferList job_offers) = do
  80. clearAllJobs
  81. for_ job_offers \jo -> do
  82. storeJob jo
  83. nativeMessageHandler port NativeMessageStorageReady = sendMessageToNative port $ NativeMessageListJobsRequest
  84. nativeMessageHandler port NativeMessageStorageUpdated = sendMessageToNative port $ NativeMessageListJobsRequest
  85. nativeMessageHandler port (NativeMessageJobAdded _) = sendMessageToNative port $ NativeMessageListJobsRequest
  86. nativeMessageHandler _ m = logShow m
  87. sendConfigurationToNative ∷ Port → Effect Unit
  88. sendConfigurationToNative port = launchAff_ do
  89. path <- getJobsPath
  90. case path of
  91. Left l' -> log $ "Could not read value of jobsPath : " <> printJsonDecodeError l'
  92. Right path' -> liftEffect $ sendMessageToNative port $ NativeMessageInitialConfiguration {jobsPath: path'}